linux命令後台執行

2022-05-03 08:39:06 字數 4605 閱讀 4776

**:

想退出securecrt後,能夠繼續跑自己的程序

為什麼會有這樣的需求?作為系統管理員,經常遇到這樣的問題,用 telnet/ssh 登入了遠端的 linux 伺服器,需要執行了一些耗時較長的任務,例如批量ping一些網段之類, 有時候卻由於網路的不穩定導致任務中途失敗,或者需要中途離開,總不會在等它結束吧,如果你退出ssh登陸的話,那麼你的任務也會被終止了,豈不是白費精 力了?如何讓命令或者任務在後台自己的執行,可以有很多方式實現,向大家都不陌生了,例如nohup,setsid和screen等等,我就簡單說說吧。

在我們通過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訊號呢?

如果傳送了sighup訊號,那麼所有該shell下執行的程序都會被終止,也就是所希望的後台執行沒有實現。在shell的options中,有huponexit這個選項,意思就是退出shell時候,是否傳送這個sighup訊號?

上面的預設選項中,huponexit       off,這個情況時候,當你退出shell時候,後台的程式還會繼續執行,但是這個是全域性選項,有時候我們往往希望退出shell後,shell發起的進 程相應結束了,而不是一直執行,因為有時候你可能開了很多子程序,沒有時間去一一關閉吧??往往這個選項是建議開啟的。

huponexit開啟後,所以後台進行的jobs,在shell退出後就會相應退出了,但是針對我們特定的任務時候,我們可以對它進行單獨操作,可以有下面集中方法。

1、nohup

nohup的用途就是讓提交的命令忽略 hangup 訊號,使用方法:

$nohup ping www.163.com & 

如果沒有重定向輸入和輸出的話,標準輸出和標準錯誤缺省會被重定向到 nohup.out 檔案中。一般像示例一樣,加上"&"來將命令同時放入後台執行,也可用">filename 2>&1"來更改預設的重定向檔名。退出shell後,ping會繼續執行,直到命令執行結束。

$ ps -ef |grep ping       

sszheng   5377 5311 0 16:51 pts/1    00:00:00 ping www.163.com

sszheng   5379 5311 0 16:51 pts/1    00:00:00 grep ping

退出shell後,重新登陸檢視,ping程序依然在執行,只不過他的ppid變成了1,也就是被init所管理的孤兒程序了,稍後說一下孤兒程序。

$ ps -ef |grep ping

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

sszheng   5389 5383 0 16:52 pts/0    00:00:00 grep ping

2、setsid

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命令後台執行

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

linux命令後台執行

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

linux命令後台執行

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