管理linux的後台執行

2021-05-06 15:56:19 字數 3041 閱讀 3501

在我們通過ssh登陸伺服器後,一般來說,所做的操作或者命令的輸入都是屬sshd下的shell的子程序,例如開啟個ssh終端,輸入ping www.163.com >>output.txt &,然後檢視程序情況:

$ ps -ef|grep ping

sszheng 27491 27467 0 10:20 pts/0    00:00:00 ping www.163.com

sszheng 27535 27467 0 11:40 pts/0    00:00:00 grep ping

很顯然它是shell的子程序,命令由乙個子shell在後台執行,當前shell( 27467)立即取得控制等候使用者輸入,所以我的grep就可以使用了。後台命令和當前shell的執行是並行的,他們沒有互相的依賴、等待關係,所以是非同步的並行。 現在問題來了,如果ssh退出了,bash結束了,那麼這個工作過程如何呢?後台執行的能否繼續下去?

這裡涉及到兩個問題,就是退出ssh後,在我們exit執行的shell時候,會不會向我們後台的jobs傳送sighup訊號呢?

如果傳送了

nohup是通過忽略 hup訊號來使程序避免中途被中斷,也可以用另一種方法,程序是不屬於接受 hup 訊號的終端的shell子程序,那麼自然也就不會受到 hup 訊號的影響了,真是白貓黑貓,抓到老鼠就是好貓,呵呵,廢話多了。

shell提供了setsid這個方法,

$setsid ping www.163.com & >>163.txt

$ ps -ef |grep ping

sszheng   5377     1 0 16:51 ?        00:00:00 ping www.163.com

sszheng   5395     1 0 16:56 ?        00:00:00 ping www.163.com

sszheng   5397 5383 0 16:57 pts/0    00:00:00 grep ping

大家應該注意到,上乙個示例中,ping的父程序是5311,當它的父程序退出後,它才被init(pid=1)收養,而setsid直接把ping(pid=5395)給init了,那麼就無所謂的shell退出影響了。

3、(&)

再提一下關於subshell的使用,我們知道,將乙個或多個命名包含在「()」中就能讓這些命令在子 shell 中執行中,當我們將"&"也放入「()」內之後,我們就會發現所提交的作業並不在作業列表中,也就是說,是無法通過jobs來檢視的。看看下面的程序id就知道了:

$(ping www.163.com &)

$ ps -ef |grep ping

sszheng   5377     1 0 16:51 ?        00:00:00 ping www.163.com

sszheng   5395     1 0 16:56 ?        00:00:00 ping www.163.com

sszheng   5401     1 0 17:03 pts/0    00:00:00 ping www.163.com

sszheng   5403 5383 0 17:03 pts/0    00:00:00 grep ping

可以看到,執行的5401的父程序是init了,這樣子也可以達到忽略hup訊號的目的了。

說到這裡,相信大家都略明白後台執行的方法了,簡單說下原理:bash程序終止後,init 程序會接管父程序留下的這些「孤兒程序」,所以ppid是1了,孤兒程序不是殭屍程序,下面是他們的概念和區別

殭屍程序 :乙個子程序在其父程序還沒有呼叫wait()或waitpid()的情況下退出。這個子程序就是殭屍程序。

孤兒程序 :乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init程序(程序號為1)所收養,並由init程序對它們完成狀態收集工作。

簡要說一下screen,它也是後台執行的乙個重要工具,只不過它的功能遠遠不止後台執行而已。

screen是乙個可以在多個程序之間多路復用乙個物理終端的視窗管理器。screen中有會話的概念,使用者可以在乙個screen會話中建立多個 screen視窗,在每乙個screen視窗中就像操作乙個真實的telnet/ssh連線視窗那樣。在screen中建立乙個新的視窗有這樣幾種方式:

1.直接在命令列鍵入screen命令

$ screen

screen將建立乙個執行shell的全屏視窗。你可以執行任意shell程式,就像在ssh視窗中那樣。在該視窗中鍵入exit退出該視窗,如果這是該screen會話的唯一視窗,該screen會話退出,否則screen自動切換到前乙個視窗。

2.screen命令後跟你要執行的程式。

$ screen vi test.sh

screen建立乙個執行vi test.sh的單視窗會話,退出vi將退出該視窗/會話。

3.以上兩種方式都建立新的screen會話。我們還可以在乙個已有screen會話中建立新的視窗。在當前screen視窗中鍵入c-a c,即ctrl鍵+a鍵,之後再按下c鍵,screen 在該會話內生成乙個新的視窗並切換到該視窗。

具體用法就不說了,既然不屬於ssh管理,那何來接受退出訊號呢?請注意會話這個概念。

有興趣的童鞋們,還可以看看disown相關的東東,這個東東的需求是: 如果事先在命令前加上 nohup 或者 setsid 就可以避免 hup 訊號的影響。但是如果我們未加任何處理就已經提交了命令,該如何補救才能讓它避免 hup 訊號的影響呢?

我們可以用如下方式來達成我們的目的。

上面的方式的物件是作業,如果我們在執行命令時在結尾加了"&"來使它成為乙個作業並在後台執行,我們可以通過jobs命令來得到所有作業的列表。但是如果並沒有把當前命令作為作業來執行,如何才能得到它的作業號呢?答案就是用 ctrl-z(按住ctrl鍵的同時按住z鍵)了!

ctrl-z 的用途就是將當前程序掛起(suspend),然後我們就可以用jobs命令來查詢它的作業號,再用bg jobspec來將它放入後台並繼續執行。需要注意的是,如果掛起會影響當前程序的執行結果,就不推薦大家使用了。

Linux後台執行

解除螢幕占用,並且保持命令執行。類似於windows最小化。top 檢視cpu資訊。定位將前面內容定位到後面檔案當中 echo echo aaa 1.txt 把aaa寫到 覆蓋 aaa中 echo 1.txt 可以用來清空檔案 在命令的尾部新增 進行後台執行,命令有返回還是會返回到控制台,先將返回的...

linux命令後台執行

有兩種方式 1.command 後台執行,你關掉終端會停止執行 2.nohup command 後台執行,你關掉終端也會繼續執行 1 root bin rsync.sh 用 jobs 命令檢視正在執行的任務 jobs 1 running root bin rsync.sh 如果想把它調回到前台執行,...

linux程式後台執行

方法 1在終端輸入命令 pso pso.file 2 1 解釋 將 pso直接放在後台執行,並把終端輸出存放在當前目錄下的 pso.file 檔案中。當客戶端關機後重新登陸伺服器後,直接檢視 pso.file 檔案就可看執行結果 命 令 cat pso.file 方法 2在終端輸入命令 nohup....