我正在为启动服务脚本编写一个停止例程:
do_stop()
{
rm -f $PIDFILE
pkill -f $DAEMON || return 1
return 0
}问题是pkill (与killall相同)也与表示脚本本身的进程相匹配,并且基本上会自行终止。如何解决这个问题?
发布于 2013-04-01 17:06:15
您可以从结果中显式过滤掉当前PID:
kill $(pgrep -f $DAEMON | grep -v ^$$\$)要正确使用-f标志,请确保提供守护进程的完整路径,而不仅仅是一个子字符串。这将防止您终止脚本(并消除对上述grep的需要),还将阻止终止所有其他恰好共享该守护程序名称的系统进程。
发布于 2013-04-01 17:07:51
pkill -f接受完全成熟的正则表达式。所以你不应该使用pkill -f $DAEMON,而应该使用:
pkill -f "^"$DAEMON以确保只有当进程名以给定的守护进程名启动时,才会终止进程名。
更好解决方案是在启动进程时将进程的pid (进程Id)保存在一个文件中。要停止进程,只需读取文件以获取要停止/终止的进程id。
发布于 2016-09-23 05:15:53
从您的问题判断,您并不是很难使用pgrep和pkill,所以这里有一些其他常用的选项。
1)使用/etc/init.d/functions或/lib/lsb/init-functions提供的killproc (以适合您的发行版和版本为准)。如果您正在编写服务脚本,如果您使用了其他服务之一作为示例,则可能已经包含了该文件。
Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]使用它的主要优点是,它发送SIGTERM,等待进程是否终止,并仅在必要时发送SIGKILL。
2)您还可以使用kill process的秘诀,即使用pidof找到要杀死的进程ids,它有一个-o选项,用于排除特定进程。-o的参数可以是$$、当前进程id或%PPID,后者是一个特殊变量,pidof将其解释为调用pidof的脚本。最后,如果守护进程是一个脚本,那么您将需要-x,这样您就可以尝试通过脚本的名称来终止脚本,而不是终止bash或python。
for pid in $(pidof -o %PPID -x progd); do
kill -TERM $pid
done您可以在文章Bash: How to check if your script is already running中看到一个这样的例子
https://stackoverflow.com/questions/15740481
复制相似问题