Makefile:杀死正在运行的进程

dai*_*isy 7 make ps

我有一个这样的 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

不要killallpgrep. 它们不使用相同的匹配规则,所以pgrep显示的可能不是killall杀死的。使用pkillpgrep除了它杀死匹配的进程而不是显示它们的 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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ris 7

您需要||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)