我有一个像这样的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
有什么建议么?
不要
killall
与pgrep
. 他们不使用相同的匹配规则,所以pgrep
显示的可能不是killall
杀死的。使用pkill
,这与它完全相同,pgrep
只是它杀死匹配的进程而不是显示它们的 PID。请注意,如果您同时调用pgrep
andpkill
,则会出现竞争条件:到时间pkill
运行时,显示的某些进程pgrep
可能已终止,而某些新进程可能已启动。除非您关心进程 ID,否则调用pgrep
;是没有意义的。你可以直接打电话pkill
。pkill
如果它没有找到任何要杀死的进程,则返回状态 1。要么-
在命令的开头添加,告诉 make 忽略这个错误,要么将命令更改为与pkill myserver || true
执行完全相同pkill myserver
但始终返回成功状态的命令。您需要
||true
确保第一个命令始终返回成功。pgrep
您可以通过丢弃 stderr来避免需要;例如如果您需要忽略Make中命令的结果,您应该使用这样的
-
运算符:这样Make会知道你不在乎是否
pkill
失败,并且你不必||
不必要地使用。您还可以避免打印命令和输出,
@-
如下所示: