我正在为启动服务脚本编写一个停止例程:
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)以及杀死碰巧共享守护程序名称的所有其他系统进程.
pkill -f接受一个完整的正则表达式.所以而不是pkill -f $DAEMON你应该使用:
pkill -f "^"$DAEMON
Run Code Online (Sandbox Code Playgroud)
要确保只有进程名称以给定的守护程序名称开头,才会终止它.
更好的解决方案是在启动进程时将进程的pid(进程ID)保存在文件中.并且为了停止该过程,只需读取文件以获取进程ID被停止/终止.
| 归档时间: |
|
| 查看次数: |
5392 次 |
| 最近记录: |