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 で 'once' を指定できますか (または同等の方法 - 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の下で実行する場合(サービスはバックグラウンドに分岐してはなりません)、実行中のインスタンスが 1 つだけ存在することが保証されます。runit は、サービスが実行されていない場合、または終了またはクラッシュした場合にサービスを開始し、要求があればサービスを停止し、pidfile を保持します。

于 2010-01-27T21:00:13.417 に答える