2013-04-01 4 views
10

Я пишу стоп процедуру для запуска службы сценария:Предотвратить процесс от убийства себя, используя pkill

do_stop() 
{ 
    rm -f $PIDFILE 
    pkill -f $DAEMON || return 1 
    return 0 
} 

Проблема заключается в том, что pkill (то же самое с killall) также соответствует процессу, представляющий сам скрипт и это в основном заканчивается. Как это исправить?

+0

использование pgrep и петля затем убить? –

+0

Я собирался это сделать, но задал вопрос здесь, если есть более простое решение. – kaspersky

ответ

9

Вы можете явно отфильтровать текущий PID из результатов:

kill $(pgrep -f $DAEMON | grep -v ^$$\$) 

Чтобы правильно использовать -f флаг, обязательно поставить весь путь к демону, а не только подстроки. Это не позволит вам убить скрипт (и устранить необходимость выше grep), а также убить все другие системные процессы, которые могут совместно использовать имя демона.

+0

Спасибо, что сработало очень хорошо. – kaspersky

+0

Для меня в bash 'pgrep' находит также pid подоболочки и печатает уродливое предупреждение при попытке его убить. – rudimeier

6

pkill -f принимает полномасштабное регулярное выражение. Таким образом, вместо pkill -f $DAEMON вы должны использовать:

pkill -f "^"$DAEMON 

Чтобы убедиться, только если имя процесса начинается с данным демоном именем, то только он убит.

Лучшее решение будет сохранять pid (Proces Id) процесса в файле при запуске процесса. И для остановки процесса просто прочитайте файл, чтобы получить идентификатор процесса, который нужно остановить/убить.

1

Судя по вашему вопросу, вам не сложно использовать pgrep и pkill, так что вот некоторые другие варианты, которые обычно используются.

1) Используйте killproc от /etc/init.d/functions или /lib/lsb/init-functions (который когда-либо подходит для вашего распространения и версии Linux). Если вы пишете сценарий службы, вы уже можете включить этот файл, если в качестве примера использовали одну из других служб.

Usage: killproc [-p pidfile] [ -d delay] {program} [-signal] 

Основное преимущество использования этого является то, что он посылает SIGTERM, ждет, чтобы увидеть, если процесс завершается и отправляет SIGKILL только в случае необходимости.

2) Вы также можете использовать секретный соус killproc, который должен найти идентификаторы процесса для уничтожения с использованием pidof, который имеет опцию -o для исключения конкретного процесса. Аргументом для -o может быть $$, текущий идентификатор процесса или %PPID, который является специальной переменной, которую pidof интерпретирует как скрипт, вызывающий pidof. Наконец, если демон является скриптом, вам понадобится -x, поэтому вы пытаетесь убить скрипт по имени, а не убивать bash или python.

for pid in $(pidof -o %PPID -x progd); do 
    kill -TERM $pid 
done 

Вы можете увидеть пример этого в статье Bash: How to check if your script is already running

Смежные вопросы