从同一个脚本中杀死其他bash守护进程

时间:2010-01-27 19:01:12

标签: bash macos process daemon kill

我正在尝试编写一个“杀死所有其他守护程序进程”函数,以便在bash守护程序中使用。我不希望一次运行多个守护进程。有什么建议?这就是我所拥有的:

    #!/bin/bash

    doService(){
        while
        do  
        something
        sleep 15
        done
    }

    killOthers(){
        otherprocess=`ps ux | awk '/BashScriptName/ && !/awk/ {print $2}'| grep -Ev $$`

        WriteLogLine "Checking for running daemons."

        if [ "$otherprocess" != "" ]; then 
            WriteLogLine "There are other daemons running, killing all others."
            VAR=`echo "$otherprocess" |grep -Ev $$| sed 's/^/kill /'`
            `$VAR`
        else
            WriteLogLine "There are no daemons running."    
        fi
      }


      killOthers
      doService

它在某些时候起作用,而在其他时候起作用。几乎没有任何一致性。

3 个答案:

答案 0 :(得分:2)

您已使用grep -v删除了当前进程ID,因此在发出kill时没有理由再次执行此操作。也没有理由在变量中构建kill。只是做:

kill $otherprocess

但为什么不使用:

pkill -v $$ BashScriptName

pkill -v $$ $0

没有任何grep。

然后你可以这样做:

if [[ $? ]]
then
    WriteLogLine "Other daemons killed."
else
    WriteLogLine "There are no daemons running."
fi

答案 1 :(得分:1)

你可以在这里尝试旧的'锁定文件'技巧吗?测试文件:如果它不存在,则创建它然后启动;否则退出。

像:

#!/bin/bash
LOCKFILE=/TMP/lockfile
if [ -f "$LOCKFILE" ]; then
        echo "Lockfile detected, exiting..."
        exit 1
fi
touch $LOCKFILE
while : 
do
        sleep 30
done
rm $LOCKFILE # assuming an exit point here, probably want a 'trap'-based thing here.

缺点是,如果遗留一个孤儿,你必须不时清理锁文件。

你可以将它转换为'rc'(或S * / K *脚本吗?),这样你就可以在inittab中指定'once'(或等效的方法 - 在MacOS上不确定)?

就像这里描述的那样:

http://aplawrence.com/Unixart/startup.html

编辑:

可能这个Apple Doc可能会有所帮助:

http://developer.apple.com/mac/library/DOCUMENTATION/MacOSX/Conceptual/BPSystemStartup/Articles/StartupItems.html

答案 2 :(得分:0)

如果您run service under runit - 服务必须不在后台 - 您可以保证只有一个实例运行。 runit启动服务,如果它没有运行,或者它退出或崩溃,如果你要求停止它,保持一个pidfile。