使用pkill防止进程自杀

kas*_*sky 14 linux bash

我正在为启动服务脚本编写一个停止例程:

do_stop()
{
  rm -f $PIDFILE
  pkill -f $DAEMON || return 1
  return 0
}
Run Code Online (Sandbox Code Playgroud)

问题是pkill(与killall相同)也匹配代表脚本本身的进程,它基本上终止了自己.如何解决?

use*_*342 12

您可以从结果中明确过滤出当前的PID:

kill $(pgrep -f $DAEMON | grep -v ^$$\$)
Run Code Online (Sandbox Code Playgroud)

要正确使用该-f标志,请确保提供守护程序的整个路径,而不仅仅是子字符串.这将阻止您杀死脚本(并消除对上述内容的需要grep)以及杀死碰巧共享守护程序名称的所有其他系统进程.


anu*_*ava 8

pkill -f接受一个完整的正则表达式.所以而不是pkill -f $DAEMON你应该使用:

pkill -f "^"$DAEMON
Run Code Online (Sandbox Code Playgroud)

要确保只有进程名称以给定的守护程序名称开头,才会终止它.

更好的解决方案是在启动进程时将进程的pid(进程ID)保存在文件中.并且为了停止该过程,只需读取文件以获取进程ID被停止/终止.