killall在同名的过程中

时间:2009-05-21 02:24:59

标签: unix

我想在一个名为killall的同名进程上使用killall,而不会杀死产生killall的进程。

所以更详细地说,我有进程foo,并且进程foo正在运行。我希望能够运行“foo -k”,让新的foo杀死旧的foo,而不会自杀。

3 个答案:

答案 0 :(得分:4)

pgrep foo | grep -v $$ | xargs kill

如果您没有pgrep,则必须提出一些其他方法来生成感兴趣的PID列表。一些选项是:

  1. 使用ps和适当的选项,然后使用grep,sed和/或awk的某种组合来匹配进程并提取PID。

  2. killall可以发送信号0而不是SIGTERM;这个标准语义是它不发送信号,而只是确定进程是否存活。也许您可以使用killall来选择进程列表并使其打印匹配的活动的PID。这也可能需要使用sed进行一些后期处理。

  3. Linux的/proc文件系统可能存在一些内容,其中伪文件包含您可以浏览的系统数据。再次,grep / awk / sed是你的朋友。

  4. 如果您确实需要有关如何执行此操作的特定详细信息,请发送评论或向我发送邮件,我将尝试更详细地扩展其中一些选项。

    [编辑:为没有pgrep的人添加了更多选项。]

答案 1 :(得分:2)

这似乎适用于OS X:

killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/'

killall -s列出它会做什么,一次一个PID。除了杀死自己外,做它会做什么。

答案 2 :(得分:1)

解决此问题的常用方法是让foo将其进程ID写入文件,例如在{em>守护程序模式中运行时/var/run/foo.pid。然后,您可以让非守护程序版本从PID文件中读取PID并直接在其上调用kill(2)。这通常是apache等处理它的方式。当然,较新的OSX守护进程会通过launchd(8),但仍有一些使用旧的老式信号。