2009-05-21 34 views
1

我想用killall来执行killall将被执行的同名进程,而不会杀死产生killall的进程。关于同名进程的killall

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

回答

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在这里是你的朋友。

如果确实需要对如何做到这一点,评论或给我的邮件,我会尝试扩大一些选项更详细具体细节。

[编辑:对于那些没有加入p纤ep更多选项]

+0

不错!我应该规定,尽管它需要能够在默认的OS X安装环境中完成,而OS X安装似乎没有pgrep。 – user53937 2009-05-21 02:37:02

+0

它有pidof吗? – bdonlan 2009-05-21 03:21:46

2

这似乎在OS X上运行:

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

killall -s列出什么会做,一个PID在同一时间。做自己会做的事情,除了自杀。

1

通常的办法来解决,这是有foo进程ID写入到文件中,这样说:/var/run/foo.pid,当它在守护模式运行。然后,您可以让非守护程序版本从PID文件中读取PID,并直接在其上调用kill(2)。这通常是apache等处理它的方式。当然,较新的OSX守护进程通过launchd(8)代替,但仍有少数使用良好的老式信号。