Linux手工啟動進程
為興寧等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及興寧網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為網(wǎng)站設計制作、成都網(wǎng)站制作、興寧網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
手工啟動進程指的是由用戶輸入命令直接啟動一個進程,根據(jù)所啟動的進程類型和性質(zhì)不同,又細分為前臺啟動和后臺啟動兩種。
前臺啟動進程
這是手工啟動進程最常用的方式,因為當時輸入一個命令并運行,就已經(jīng)啟動了一個進程,而且是一個前臺的進程,此時系統(tǒng)其實已經(jīng)處于一個多進程的狀態(tài),一個是shell進程,另一個是新啟動的進程。
實際上,系統(tǒng)自動時就有許多進程悄悄地在后臺運行,不過為了方便閱讀,并沒有將這些進程包括在內(nèi)。
假如啟動一個比較耗時的進程,然后再把該進程掛起,并使用ps命令查看,就會看到該進程在PS顯示列表中。將進程掛起,指的是將前臺運行的進程放到后臺,并且暫停其運行。
后臺啟動進程
進程直接從后臺運行,用的相對比較少,除非該進程非常耗時,且用戶也不急著需要其運行結(jié)果的時候,例如,用戶需要啟動一個需要長時間運行的格式化文本文件的進程,為了不使整個shell在格式化過程中都處于被占用狀態(tài),從后臺啟動這個進程是比較明智的選擇。
從后臺啟動進程,其實就是在命令結(jié)尾處添加一個符號。輸入命令并運行之后,shell會提供給我們一個數(shù)字,此數(shù)字就是該進程的進程號。然后直接就會出現(xiàn)提示符,用戶就可以繼續(xù)完成其他工作。
手工啟動的2種方式,實際上它們有個共同的特點,就是新進程都是由當前shell這個進程產(chǎn)生的,換句話說,是shell創(chuàng)建了新進程,于是稱這種關(guān)系為進程間的父子關(guān)系,其中shell是父進程,新進程是子進程。
且一個父進程可以有多個子進程,通常子進程結(jié)束后才能繼續(xù)父進程;當然,如果是從后臺啟動,父進程就不用等待子進程了。
Linux調(diào)度啟動進程
在Linux系統(tǒng)中,任務可以被配置在指定的時間、日期或者系統(tǒng)平均負載量低于指定值時自動啟動。
例如,Linux預配置了重要系統(tǒng)任務的運行,以便可以使系統(tǒng)能夠?qū)崟r被更新,系統(tǒng)管理員也可以使用自動化的任務來定期對重要數(shù)據(jù)進行備份。
實現(xiàn)調(diào)度啟動進程的方法有很多,比如通過crontab、cat等命令。
上一章我們用fork函數(shù)創(chuàng)建了進程,也了解了進程的一些知識
這一章呢我們來了解下另一個能夠創(chuàng)建進程的函數(shù):vfork函數(shù)。
vfork函數(shù)的作用基本和fork函數(shù)類似,調(diào)用流程和返回值與fork函數(shù)完全相同。
那么fork和vfork有什么區(qū)別呢?
我們來看一下下面這幾段程序:
我們可以從中看到:
1、 vfork創(chuàng)建的子進程會先運行,可以說子進程和附近陳的結(jié)果是確定的,fork先運行那個不能確定
2、 vfork創(chuàng)建的進程中父進程和子進程共享了全部變量(k)和局部變量(i)的數(shù)據(jù)
3、 因為vfork是子進程先運行,父進程掛起,可以看到直至子進程調(diào)用exec或則exit之后父子進程的執(zhí)行次序不再有限制,因此,如果在子進程調(diào)用exec或exit之前需要父進程的進一步活動,就會造成死鎖
4、 可以看到在不調(diào)用exec或exit時,局部變量在父進程中會出現(xiàn)不可預料的結(jié)果
5、 在子進程調(diào)用了exec或exit后,子進程后面的代碼并沒有運行
linux是一個 多進程 多用戶的操作系統(tǒng)
ps(顯示當前進程的狀態(tài))
ps -ef 查看當前l(fā)inux 進程
ps -ef | grep 'mysqld' 過濾mysql的進程 (grep 過濾 ; | 管道符)
uid 用戶id
pid 進程id
ppid 父進程id
CMD 啟動該進程的命令
kill(刪除執(zhí)行中的進程)
kill -9 : kill -9 1982
-9 最高級別的關(guān)閉進程
小注:模擬運行著進程,可以使用tailf demo.txt ;ps -ef |grep ‘tailf’
面試:現(xiàn)在在linux上運行著多個flask ,不確定有多少個進程,請以簡短的命令,將這些進程殺死?
ps -ef | grep 'flask' | grep -v 'grep' | awk '{print "kill -9" $2}' | sh
排除grep 批量找pid 命令執(zhí)行
(后臺運行進程)
crontab(定時任務)
軟件安裝命令
rpm(管理安裝套件)
yum(Shell前端軟件包管理器)
Linux命令-查看進程命令:pstree
查看進程樹,ps aux查看進程,如果進程太多看起來很不方便,可以使用pstree以樹形方式顯示正在運行的所有進程 pstree -p 查看進程樹 還是太多了,可以使用管道符進行查找httpd(apa ...
Linux命令-終止進程命令:kill
kill -l 查看進程信號 常用信號 例如: 例子參見:Linux命令-查看進程命令:pstree
linux ps查看進程命令
linux ps查看進程命令ps命令作用:將某個時間點的程序運作情況擷取下來 實例: [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ...
Linux ps 命令查看進程啟動及運行時間
前三個和最后一個是兩個類型。前三個主要是Linux用來創(chuàng)建新的進程(線程)而設計的,exec()系列函數(shù)則是用來用指定的程序替換當前進程的所有內(nèi)容。所以exec()系列函數(shù)經(jīng)常在前三個函數(shù)使用之后調(diào)用,來創(chuàng)建一個全新的程序運行環(huán)境。Linux用init進程啟動其他進程的過程一般都是這樣的。
下面說fork、vfork和clone三個函數(shù)。這三個函數(shù)分別調(diào)用了sys_fork、sys_vfork、sys_clone,最終都調(diào)用了do_fork函數(shù),差別在于參數(shù)的傳遞和一些基本的準備工作不同??梢娺@三者最終達到的最本質(zhì)的目的都是創(chuàng)建一個新的進程。在這里需要明確一下,Linux內(nèi)核中沒有獨立的“線程”結(jié)構(gòu),Linux的線程就是輕量級進程,換言之基本控制結(jié)構(gòu)和Linux的進程是一樣的(都是通過struct task_struct管理)。
fork是最簡單的調(diào)用,不需要任何參數(shù),僅僅是在創(chuàng)建一個子進程并為其創(chuàng)建一個獨立于父進程的空間。fork使用COW(寫時拷貝)機制,并且COW了父進程的??臻g。
vfork是一個過時的應用,vfork也是創(chuàng)建一個子進程,但是子進程共享父進程的空間。在vfork創(chuàng)建子進程之后,父進程阻塞,直到子進程執(zhí)行了exec()或者exit()。vfork最初是因為fork沒有實現(xiàn)COW機制,而很多情況下fork之后會緊接著exec,而exec的執(zhí)行相當于之前fork復制的空間全部變成了無用功,所以設計了vfork。而現(xiàn)在fork使用了COW機制,唯一的代價僅僅是復制父進程頁表的代價,所以vfork不應該出現(xiàn)在新的代碼之中。在Linux的manpage中隊vfork有這樣一段話:It is rather unfortunate that Linux revived this specter from the past. The BSD man page states: "This system call will be eliminated when proper system sharing mechanisms are implemented. Users should not depend on the memory sharing semantics of vfork() as it will, in that case, be made synonymous to fork(2)."
clone是Linux為創(chuàng)建線程設計的(雖然也可以用clone創(chuàng)建進程)。所以可以說clone是fork的升級版本,不僅可以創(chuàng)建進程或者線程,還可以指定創(chuàng)建新的命名空間(namespace)、有選擇的繼承父進程的內(nèi)存、甚至可以將創(chuàng)建出來的進程變成父進程的兄弟進程等等。clone和fork的調(diào)用方式也很不相同,clone調(diào)用需要傳入一個函數(shù),該函數(shù)在子進程中執(zhí)行。此外,clone和fork最大不同在于clone不再復制父進程的??臻g,而是自己創(chuàng)建一個新的。
關(guān)于Linux命令的介紹,看看《linux就該這么學》,具體關(guān)于這一章地址3w(dot)linuxprobe/chapter-02(dot)html