killall на одноименном процессе - PullRequest
1 голос
/ 21 мая 2009

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

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

Ответы [ 3 ]

4 голосов
/ 21 мая 2009
pgrep foo | grep -v $$ | xargs kill

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

  1. Используйте ps с соответствующими параметрами, после чего следует некоторая комбинация grep, sed и / или awk для согласования процессов и извлечения PID.

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

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

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

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

2 голосов
/ 21 мая 2009

Это похоже на OS X:

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

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

1 голос
/ 21 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...