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代表具體進程號。
參考
[2]nohup, /dev/null 2>&1,輸出重定向