2

我正在尝试编写一个“杀死所有其他守护进程”函数以在 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

它在某些时候有效,但在其他时候无效。几乎没有什么一致的。

4

3 回答 3

2

您已经使用删除了当前进程 ID,grep -v因此当您发出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
于 2010-01-27T19:15:25.053 回答
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 中指定“一次”(或等效方法 - 在 MacOS 上不确定)?

就像这里描述的一样:

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

编辑:

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

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

于 2010-01-27T19:14:36.543 回答
0

如果你在runit运行你的服务 ——服务不能分叉到后台——你可以保证只有一个实例在运行。如果它没有运行,或者如果它退出或崩溃,runit 会启动它,如果你问它,它会停止它,并保留一个 pidfile。

于 2010-01-27T21:00:13.417 回答