Linux運行與控制后台進程的方法:nohup, setsid, &, disown, screen


Linux運行與控制后台進程的方法:nohup, setsid, &, disown, screen

轉自http://heylinux.com/archives/1282.html#more-1282 

 

我們經常會碰到這樣的問題,用ssh登錄了遠程的Linux服務器,運行了一些耗時較長的任務,結果卻由於網絡等的不穩定導致任務中途失敗。
這是由於在用戶注銷(logout)或者網絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。
解決辦法有兩種:讓進程忽略HUP信號,或讓進程運行在新的會話里從而成為不屬於此終端的子進程。

下面是對Linux下運行與控制后台進程的各種方法的介紹:
1.nohup
顧名思義,nohup的用途就是讓提交的命令忽略所有的hangup信號。
使用方法:nohup COMMAND [ARG]...

2.setsid
在一個新的會話中運行命令,從而可以避開當前終端發出的HUP信號。
使用方法:setsid COMMAND [ARG]...

3.&
可以結合()產生一個新的子shell並在這個子shell中將任務放置到后台運行,從而不受當前shell終端的HUP信號影響。
使用方法:(COMMAND [ARG]... &)

而我通常的使用方式為:
nohup ./filename.sh > filename.log 2>&1 &
三點理由:
1)nohup保障進程不會被hangup信號異常中斷;
2)將任務放置到后台運行,不占用當前的終端;
3)將錯誤輸出也打印到log中,默認>只有標准輸出,錯誤輸出沒有。


4.控制進程
通過以下命令,我們可以對放入到后台的命令進行控制

查看當前終端下的后台進程:
直接執行:jobs

將查看到的某個后台進程放回到前台:
直接輸入:fg {jobid} //這里的{jobid}是通過jobs命令中看到的進程前[]中的數字。

將當前正在前台運行的進程放到后台運行:
先敲下快捷鍵:ctrl +z //暫停當前正在運行的進程。
再執行:bg

終止當前正在前台運行的進程:
直接敲下快捷鍵:ctrl +c

5.disown
亡羊補牢,為沒有使用nohup與setsid的進程加上忽略HUP信號的功能。
使用方法:
將當前正在前台運行的進程放到后台運行(ctrl+z和bg);
然后執行disown -h %{jobid} //這里的{jobid}是通過jobs命令中看到的進程前[]中的數字。

6.通過screen來實現穩定的后台運行
screen是建立一個新的全屏虛擬會話終端,這個會話只有在手動輸入exit的時候才會退出,在這個會話里執行的命令不用擔心HUP信號會對我們的進程造成影響,因此也不用給每個命令前都加上“nohup”或“setsid”了,非常適合我們有規划的執行大量的后台任務,可以非常方便的讓我們對這些后台任務進行管理。

使用方法:
screen //立即創建並進入一個會話。
screen -dmS {name} //建立一個處於斷開模式下的會話,並根據我們的需要指定其會話名稱。
screen -list //列出所有會話。
screen -r {name} //進入指定會話。
ctrl +ad //輸入快捷鍵ctrl +a和d,可暫時退出當前會話。
exit //進入指定會話后執行exit即可關閉該會話。

參考資料:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM