Make

Makefile:如果它正在執行,則殺死一個程序

  • November 4, 2019

我有一個像這樣的makefile,如果它已經在執行,它會殺死一個程序,

test: client server
   pgrep myserver && killall myserver
   /build/bin/myserver --background
   /build/bin/myclient --server 127.0.0.1

如果我myserver以前開始過,它會起作用。如果不是,pgrep myserver則以非零狀態失敗,並且 Makefile 將其視為錯誤,例如

pgrep myserver && killall myserver
make: *** [test] Error 1

有什麼建議麼?

不要killallpgrep. 他們不使用相同的匹配規則,所以pgrep顯示的可能不是killall殺死的。使用pkill,這與它完全相同,pgrep只是它殺死匹配的程序而不是顯示它們的 PID。請注意,如果您同時呼叫pgrepand pkill,則會出現競爭條件:到時間pkill執行時,顯示的某些程序pgrep可能已終止,而某些新程序可能已啟動。除非您關心程序 ID,否則呼叫pgrep;是沒有意義的。你可以直接打電話pkill

pkill如果它沒有找到任何要殺死的程序,則返回狀態 1。要麼-在命令的開頭添加,告訴 make 忽略這個錯誤,要麼將命令更改為與pkill myserver || true執行完全相同pkill myserver但始終返回成功狀態的命令。

test: client server
   pkill myserver || true
   /build/bin/myserver --background
   /build/bin/myclient --server 127.0.0.1

引用自:https://unix.stackexchange.com/questions/448880