我想用killall来执行killall将被执行的同名进程,而不会杀死产生killall的进程。关于同名进程的killall
因此更详细地说,我有进程foo,并且进程foo正在运行。我希望能够运行“foo -k”,并让新的foo杀死旧foo,而不会自杀。
我想用killall来执行killall将被执行的同名进程,而不会杀死产生killall的进程。关于同名进程的killall
因此更详细地说,我有进程foo,并且进程foo正在运行。我希望能够运行“foo -k”,并让新的foo杀死旧foo,而不会自杀。
pgrep foo | grep -v $$ | xargs kill
如果没有pgrep
做,你就必须拿出生成感兴趣的PID列表的一些其他的方式。有些选项:
用PS与相应的选项,随后的grep的某种组合,sed和/或awk来匹配的过程和提取的PID。
killall
可以发送信号0而不是SIGTERM
;它的标准语义是它不发送信号,而只是确定进程是否存在。也许你可以使用killall来选择进程列表,并让它打印出匹配活动的PID。这也可能需要一些sed的后期处理。
Linux的/proc
文件系统可能存在一些问题,使用伪文件来保存系统数据,您可以通过这些伪文件进行打包。再次,grep/awk/sed在这里是你的朋友。
如果确实需要对如何做到这一点,评论或给我的邮件,我会尝试扩大一些选项更详细具体细节。
[编辑:对于那些没有加入p纤ep更多选项]
这似乎在OS X上运行:
killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/'
killall -s列出什么会做,一个PID在同一时间。做自己会做的事情,除了自杀。
通常的办法来解决,这是有foo
进程ID写入到文件中,这样说:/var/run/foo.pid
,当它在守护模式运行。然后,您可以让非守护程序版本从PID文件中读取PID,并直接在其上调用kill(2)
。这通常是apache等处理它的方式。当然,较新的OSX守护进程通过launchd(8)
代替,但仍有少数使用良好的老式信号。
不错!我应该规定,尽管它需要能够在默认的OS X安装环境中完成,而OS X安装似乎没有pgrep。 – user53937 2009-05-21 02:37:02
它有pidof吗? – bdonlan 2009-05-21 03:21:46