在linux中,使用nohup xxx.sh &可以將前台任務變成后台任務執行,如果只使用&的話,在突然斷網或者關閉啟動終端時,內核會向后台任務發送sighup信號,從而導致后台任務停止,此時,使用nohup命令可以忽略hangup信號,使得后台任務繼續執行。注意,nohup不會自動將任務掛在后台運行,需要配合&進行說明。
- 如果nohup命令的標准輸入是終端,那么nohup將會默認使用/dev/null來重定向。
- 如果nohup命令的標准輸出是終端,那么標准輸出會被附加到文件
nohup.out
中;如果用戶沒有在當前目錄創建文件的權限,那么就會把輸出附加到$HOME/nohup.out
中;如果還是沒有寫入權限,那么該命令就不會執行。 - 如果nohup命令的標准錯誤是終端,那么就會被定向到標准輸出的附加的文件描述符。如果標准輸出被關閉了,那么標准錯誤就會像上面一樣嘗試附加到
nohup.out
或$HOME/nohup.out
中。
測試:
新建一個腳本:打印一個數字,刪除一個不存在的文件。
# vi nohup_tes.sh
for i in `seq 1 20`; do echo $i; rm a.txt; sleep 0.5; done
后台執行該任務
nohup sh nohup_test.sh & # nohup: appending output to “nohup.out”
在上面執行的命令中,由輸出可知,標准輸出被重定向到nohup.out中,查看下該文件。
# cat nohup.out 1
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 2
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 3
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 4
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄
該文件包含了命令的標准輸出和標准錯誤輸出。
重定向標准輸出
nohup sh nohup_test.sh 1>o.out &
在上面執行的命令中,標准輸出被重定向到stdout中,而標准輸出又重定向到了o.out中。
# head o.out 1
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 2
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 3
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 4
rm: 無法刪除 “a.txt”: 沒有那個文件或目錄
該文件包含了標准輸出和標准錯誤輸出。
重定向標准輸出、標准錯誤輸出
nohup sh nohup_test.sh 1>o.out 2>e.out &
查看輸出文件
# head o.out 1
2
3
4
5 # head e.out rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 rm: 無法刪除 “a.txt”: 沒有那個文件或目錄 rm: 無法刪除 “a.txt”: 沒有那個文件或目錄
shell腳本中執行nohup的問題
如果我們在shell中執行nohup命令,並且沒有進行任何重定向,那么終端上就會彈出“nohup: ignoring input and appending output to ‘nohup.out’”,並且,只有敲擊回車,shell才能繼續執行,否則就會卡住。
只要重定向了標准錯誤輸出,終端就不會彈出任何提示,也不會卡住。但是標准錯誤附加的文件會出現其他的錯誤提示,只有重定向所有標准輸入、標准輸出和標准錯誤輸出后,不會有任何錯誤提示。如:
nohup sh nohup_test.sh >out.log 2>&1 </dev/null &
其他:
- 使用job查看任務
- 使用fg %n關閉任務
另外2個常用ftp工具:
- ncftpget:后台ftp下載
- ncftpput:后台ftp上傳
END 2018-08-22 11:24:50