Убить других демонов Bash из того же сценария - PullRequest
2 голосов
/ 27 января 2010

Я чертовски долго пытался написать функцию «убить все остальные процессы демона» для использования в демоне 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 ]

2 голосов
/ 27 января 2010

Вы уже удалили текущий идентификатор процесса, используя 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
1 голос
/ 27 января 2010

Не могли бы вы попробовать старый трюк с «файлом блокировки»? Проверьте файл: если он не существует, создайте его и запустите; в противном случае выйдите.

Как:

#!/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

EDIT:

Возможно, этот Apple Doc может помочь здесь:

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

0 голосов
/ 28 января 2010

Если вы запускаете вашу службу в runit - служба не должна переходить в фоновый режим - вы получите гарантия, что есть только один экземпляр этого работает. runit запускает службу, если она не запущена, или если она завершается или выходит из строя, останавливает ее, если вы спрашиваете, сохраняет pid-файл.

...