我有一个这样的 makefile,如果它已经在运行,它会杀死一个进程,
test: client server
pgrep myserver && killall myserver
/build/bin/myserver --background
/build/bin/myclient --server 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
如果我之前有一个myserver
开始,它会起作用。如果不是,pgrep myserver
则以非零状态失败,Makefile 将其视为错误,例如
pgrep myserver && killall myserver
make: *** [test] Error 1
Run Code Online (Sandbox Code Playgroud)
有什么建议?
Gil*_*il' 17
不要killall
与pgrep
. 它们不使用相同的匹配规则,所以pgrep
显示的可能不是killall
杀死的。使用pkill
,pgrep
除了它杀死匹配的进程而不是显示它们的 PID 之外,它完全相同。请注意,如果同时调用pgrep
and 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
Run Code Online (Sandbox Code Playgroud)
您需要||true
确保第一个命令始终返回成功。
您可以pgrep
通过丢弃 stderr来避免需要;例如
test: client server
killall myserver 2>/dev/null || true
myserver --background
myclient --server 127.0.0.1
Run Code Online (Sandbox Code Playgroud)