2013-11-27 40 views
37

我想在後臺運行我的腳本,然後編寫它的pid文件。我正在使用nohup來做到這一點。如何在單個bash語句中運行nohup並將其pid文件寫入

這就是我想出了,

nohup ./myprogram.sh > /dev/null 2>&1 & && echo $! > run.pid 

但是,這給出了一個語法錯誤。

以下不會給出語法錯誤,但問題是echo $!因爲nohup的是一個子殼

(nohup ./myprogram.sh > /dev/null 2>&1 &) && echo $! > run.pid 

此解決方案的任何運行不寫正確的PID,給我要爲實現這一一行語句?

+4

的'&'是一個命令終止,很像';'或'\ N'。這就是爲什麼'&&&'是一個語法錯誤。 – joeytwiddle

+2

我試過了,但它給了我錯誤的PID。我不知道我做錯了什麼? –

回答

78

你已經這使你的腳本在後臺重定向後有一個符號。因此,你只需要一個符號後鍵入所需的命令,而不是由其他任何前綴:

nohup ./myprogram.sh > /dev/null 2>&1 & echo $! > run.pid 
+2

嘗試了這一點,但得到一個pidfile,因爲一些奇怪的原因,後面的進程被拋棄了。所以如果pidfile說123,實際進程ID是124.任何想法? – Allen

+3

@Allen,因爲nohup分叉和一個新的進程被創建爲實際的命令。有時候這可能不是確切的下一個pid,例如在其他過程的重分叉期間。 – akostadinov

+0

@Grigor Yosifov,在命令中是什麼目的:2>&1? – Zubair

13

這應該工作:

nohup ./myprogram.sh > /dev/null 2>&1 & 
echo $! > run.pid 
+0

但是這使用了多行。我不能用單線做這個嗎? – amitkarmakar

+3

是的,換行符是可選的。 – joeytwiddle

+6

@ amit.codename13:當然可以使用它,如'nohup ./myprogram.sh>/dev/null 2>&1&echo $! > run.pid'我只是把它放在兩行中,僅用於理解目的。 – anubhava

相關問題