nohup 后台運行程序以及輸出重定向


Linux有兩種命令使程序后台運行

第一種:支持后台運行,但是關閉終端的話,程序也會停止

command &

第二種:支持后台運行,關閉終端后,程序也會繼續運行

nohup command &

但是,當我自己使用nohup這個命令時,會報下面這樣的錯。

nohup: ignoring input and appending output to ‘nohup.out’

或者這樣的錯。

nohup: failed to run command /etc/nginx_check.sh': Permission denied

要解決的話,我們首先先得談一下Linux重定向

Linux重定向

0、1和2分別表示標准輸入、標准輸出和標准錯誤信息輸出,可以用來指定需要重定向的標准輸入或輸出。

我們可以直接通過輸出重定向>(或>>,表示追加)將某種輸出重定向到其他地方,如設備,文件。

值得一提的是,Linux下還有一個特殊的文件/dev/null,它就像一個無底洞,所有重定向到它的信息都會消失得無影無蹤。這一點非常有用,當我們不需要回顯程序的所有信息時,就可以將輸出重定向到/dev/null

比如說:

ls > ls.log  #標准輸出重定向
ls 2> ls.log #標准錯誤重定向
ls > /dev/null #重定向到null設備,相當於直接忽略輸出

但是,有時候,我們想把標准輸出以及錯誤輸出一起重定向某個文件,這是可以通過 2>&1 實現,也可以通過兩個同時重定向到某個文件。

所以,可以這樣:

ls >ls.log 2>&1 #標准輸出重定向到ls.log,而錯誤又重定向到標准輸出,這兩個位置不可換
ls 2>>ls.log 1>>ls.log

但是Python會有一個緩沖,導致輸出不會及時地存在log文件里,我們只需要加一個參數-u

所以最后,我們可以這樣來運行我們的程序。

nohup python -u hello.py >hello.log 2>&1 &

這樣,我們把所有的輸出都存在了hello.log文件中。

關閉nohup程序

關閉終端后,再次打開使用命令jobs已經無法看到后台跑的程序了。此時利用ps(進程查看命令)。

使用下面的命令來查看start.py

ps -aux | grep "start.py"

其中,上面的-aux代表三個參數,a表示顯示所有程序,u表示以用戶為主的格式來顯示,x顯示所有程序且不以終端機來區分。grep命令用來查找,后面它的參數也可以是其他的,比如說python。

執行這條命令后,就能找到我們的nohup程序的進程號。然后使用kill命令結束程序。

kill %1400

其中1400代表具體進程號。

參考

[1]python nohup linux 后台運行輸出

[2]nohup, /dev/null 2>&1,輸出重定向

[3]使用Linux重定向解決nohup.out無寫權限問題

[4]詳解linux后台運行和關閉、查看后台任務


免責聲明!

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



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