首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止进程使用pkill终止自身

防止进程使用pkill终止自身
EN

Stack Overflow用户
提问于 2013-04-01 17:01:25
回答 3查看 7K关注 0票数 15

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

代码语言:javascript
复制
do_stop()
{
  rm -f $PIDFILE
  pkill -f $DAEMON || return 1
  return 0
}

问题是pkill (与killall相同)也与表示脚本本身的进程相匹配,并且基本上会自行终止。如何解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-01 17:06:15

您可以从结果中显式过滤掉当前PID:

代码语言:javascript
复制
kill $(pgrep -f $DAEMON | grep -v ^$$\$)

要正确使用-f标志,请确保提供守护进程的完整路径,而不仅仅是一个子字符串。这将防止您终止脚本(并消除对上述grep的需要),还将阻止终止所有其他恰好共享该守护程序名称的系统进程。

票数 15
EN

Stack Overflow用户

发布于 2013-04-01 17:07:51

pkill -f接受完全成熟的正则表达式。所以你不应该使用pkill -f $DAEMON,而应该使用:

代码语言:javascript
复制
pkill -f "^"$DAEMON

以确保只有当进程名以给定的守护进程名启动时,才会终止进程名。

更好解决方案是在启动进程时将进程的pid (进程Id)保存在一个文件中。要停止进程,只需读取文件以获取要停止/终止的进程id。

票数 11
EN

Stack Overflow用户

发布于 2016-09-23 05:15:53

从您的问题判断,您并不是很难使用pgrep和pkill,所以这里有一些其他常用的选项。

1)使用/etc/init.d/functions/lib/lsb/init-functions提供的killproc (以适合您的发行版和版本为准)。如果您正在编写服务脚本,如果您使用了其他服务之一作为示例,则可能已经包含了该文件。

代码语言:javascript
复制
Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]

使用它的主要优点是,它发送SIGTERM,等待进程是否终止,并仅在必要时发送SIGKILL。

2)您还可以使用kill process的秘诀,即使用pidof找到要杀死的进程ids,它有一个-o选项,用于排除特定进程。-o的参数可以是$$、当前进程id或%PPID,后者是一个特殊变量,pidof将其解释为调用pidof的脚本。最后,如果守护进程是一个脚本,那么您将需要-x,这样您就可以尝试通过脚本的名称来终止脚本,而不是终止bash或python。

代码语言:javascript
复制
for pid in $(pidof -o %PPID -x progd); do
    kill -TERM $pid
done

您可以在文章Bash: How to check if your script is already running中看到一个这样的例子

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15740481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档