2011-04-24 63 views
5

我的Makefile是這個樣子:獲得最後一道工序PID Makefile中

setsid ./CppServer>daemon.log 2>&1 & 
echo $!>daemon.pid 

我希望它做的是my_awesome_script的PID存儲在相應的文件。但是沒有什麼。那麼問題在哪裏?

回答

4

如果你的makefile看起來像這樣,你會得到一個錯誤,因爲我沒有看到任何實際的make語法,只是shell語法。但是,我的水晶球告訴我這兩條線可能是規則配方的一部分。如果他們是,你應該意識到如何執行食譜;爲每行創建一個單獨的子shell,其中該行的命令是獨立執行的:你的兩個命令對彼此的環境沒有任何瞭解。如果你想在同一個子shell中執行兩條命令,你應該將它們作爲一行發佈(如果需要,可以使用續行字符),或者使用make的ONESHELL指令。

+1

這沒有幫助。告訴我:爲什麼是$!在Makefiles中詢問時是否爲空? – nalply 2011-08-08 08:46:15

+2

@nalply:它是空的,因爲make沒有定義具有該名稱的變量。如果你想在shell中使用它,你必須避開美元符號'$$!',但是你必須意識到我在一行中發出命令的意思,並且被例如分隔開。一個分號。 – eriktous 2011-08-08 23:12:03

+0

@eriktous偉大的答案,絕對有幫助。我確實有下一個nalply的問題,當然是$$!解決了這個問題。 – David 2013-10-18 15:25:26

0

您正在嘗試使用的變量將打印在後臺運行的最後一個程序的pid。它被正確寫成echo $! > filename.extension。但既然你在foregorund中運行它,你有兩個選擇。通過將&添加到行尾./script_to_run &,在後臺運行它,或者可以通過使用echo $$> filename.extension(腳本內部)將腳本自身打印到文件中以記錄當前正在運行的進程的pid )。這裏有一個鏈接可能會幫助你http://tldp.org/LDP/abs/html/internalvariables.html

+0

將額外的$添加到內部變量的前面並不是必須的。 – rubixibuc 2011-04-24 02:44:34

+0

對不起,我在這個問題中提供的Makefile的內容並不像它在實際的Makefile中那樣(我在後臺運行腳本)。但現在是。 – Alex 2011-04-24 09:50:26

+0

我正在運行一個程序,而不是一個腳本,我正在追加和調用。但$!仍然是空的。那麼現在怎麼辦? :-) – nalply 2011-08-08 08:48:24