[Linux] nohup/setsid/& 讓進程在后台可靠運行


 

當用戶注銷(logout)或者網絡斷開時,終端會收到 HUP(hangup)信號從而關閉其所有子進程。因此,我們的解決辦法就有兩種途徑:要么讓進程忽略 HUP 信號,要么讓進程運行在新的會話里從而成為不屬於此終端的子進程

(hangup 名稱的來由:在 Unix 的早期版本中,每個終端都會通過 modem 和系統通訊。當用戶 logout 時,modem 就會掛斷(hang up)電話。 同理,當 modem 斷開連接時,就會給終端發送 hangup 信號來通知其關閉所有子進程)

 

1.nohup:讓提交的命令忽略 hangup 信號

nohup 的幫助信息:

$ nohup --help

Usage: nohup COMMAND [ARG]... or: nohup OPTION
Run COMMAND, ignoring hangup signals.
--help display this help and exit --version output version information and exit If standard input is a terminal, redirect it from an unreadable file. If standard output is a terminal, append output to 'nohup.out' if possible, '$HOME/nohup.out' otherwise. If standard error is a terminal, redirect it to standard output. To save output to FILE, use 'nohup COMMAND > FILE'.

 

使用:在要處理的命令前加上 nohup 即可,標准輸出和標准錯誤缺省會被重定向到 nohup.out 文件中。一般我們可在結尾加上"&"來將命令同時放入后台運行,也可用"> filename"來更改缺省的重定向文件路徑。

nohup ping www.baidu.com &
nohup python train_model.py > console.log &

 

2.setsid:在新session執行命令(使進程不屬於接受 HUP 信號的終端的子進程,那么就不會受到 HUP 信號的影響)

setsid的幫助信息:

$ setsid --help

Usage:
 setsid [options] <program> [arguments ...]

Run a program in a new session.

Options:
 -c, --ctty     set the controlling terminal to the current one
 -w, --wait     wait program to exit, and use the same return
 -h, --help     display this help and exit
 -V, --version  output version information and exit

 

使用:

setsid ping www.ibm.com &

 

另外,查看進程並停止:

$ ps -ef | grep ping
abby      3899  1632  0 14:39 ?        00:00:00 ping www.baidu.com
abby      4038  3907  0 14:43 pts/20   00:00:00 grep --color=auto ping

$ kill -9 3899

 

參考:

Linux 技巧:讓進程在后台可靠運行的幾種方法

 


免責聲明!

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



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