2009-05-21 4 views
1

Я хотел бы использовать killall в процессе с тем же именем, из которого killall будет выполнен без уничтожения процесса, порождающего killall.killall on process с таким же именем

Так что более подробно, скажем, у меня есть процесс foo, и процесс foo работает. Я хочу иметь возможность запускать «foo -k», а новый foo убивает старый foo, не убивая себя.

ответ

4
pgrep foo | grep -v $$ | xargs kill 

Если у вас нет pgrep, вам придется придумать какой-то другой способ создания списка PIDs интересов. Некоторые опции:

  1. Использование пс с соответствующими параметрами, а затем некоторой комбинации Grep, СЭД и/или AWK для соответствия процессов и извлечь ИДП.

  2. killall может посылать сигнал 0 вместо SIGTERM; стандартная семантика этого заключается в том, что он не посылает сигнал, а просто определяет, жив ли этот процесс или нет. Возможно, вы можете использовать killall, чтобы выбрать список процессов и получить его для печати PID из совместимых, которые являются живыми. Это также, вероятно, потребует немного последующей обработки с sed.

  3. Возможно, что-то похожее на файловую систему Linux /proc с псевдо-файлами, хранящими системные данные, которые вы можете передать. Опять же, grep/awk/sed - ваши друзья здесь.

Если вам действительно нужна конкретная информация о том, как это сделать, прокомментируйте или отправьте мне письмо, и я попытаюсь расширить некоторые из этих параметров более подробно.

[Изменения: добавлены. Дополнительные варианты для тех, кто не pgrep]

+0

Ницца! Я должен был предусмотреть, что он должен быть выполнен в контексте установки OS X по умолчанию, которая, как представляется, не имеет pgrep. – user53937

+0

У этого есть pidof? – bdonlan

2

Это, кажется, работает на OS X:

killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/' 

killall -s перечисляет то, что он будет делать, один PID в то время. Сделайте то, что он сделает, кроме как убить себя.

+1

Обратите внимание, что -s ведет себя по-разному в Linux, поэтому будьте осторожны, если вы портируете это в будущем. – bdonlan

1

Обычный способ решить эту проблему, чтобы иметь foo написать свой идентификатор процесса в файл, что-то вроде /var/run/foo.pid, когда он работает в режиме демона . Затем вы можете иметь версию, отличную от daemon, для чтения PID из файла PID и напрямую вызвать kill(2). Обычно это как apache и тому подобное. Конечно, новые демоны OSX проходят через launchd(8), но есть еще некоторые, которые используют хорошие старомодные сигналы.

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