Как мне завершить все процессы с одним и тем же именем более аккуратно, чем killall
это? Я не хочу прерывать процессы, но оставляю им время для правильного выхода.
Смотрите также:
В чем разница между процессом Kill Process и End Process в системном мониторе?
command-line
process
kill
killall
сумасшедший о натти
источник
источник
Ответы:
1. `killall` уже приятно (SIGTERM)
killall
по умолчанию отправляетSIGTERM
. Это уже хороший подход, который оставляет приложениям возможность убирать за собой. "Иди умри уже, прямо сейчас!" Подход заключается в отправкеSIGKILL
сигнала, который требует указать это в качестве опцииkillall
. Из библиотеки GNU C: Сигналы завершения :2. «Завершить процесс» в системном мониторе одинаково хорошо (тоже SIGTERM)
Вы ссылаетесь на вопрос о системном мониторе GNOME. Это также используется
SIGTERM
для его действия «Завершить процесс» (и я понимаю, что я противоречу ответу на этот вопрос). Вы можете найти его в исходном коде, чтобы проверить себя:data / menus.ui :
15 здесь - это номер сигнала. Сигнал 15 есть
SIGTERM
. И Системный Монитор использовалSIGTERM
задолго до того, как на другой вопрос был задан и дан ответ.Техническое приложение (в ответ на комментарий)
Просматривая представление Github для
git blame
, вот изменения, которые были внесены в то, как сигналы записаны в исходном коде GNOME System Monitor:383007f2 24 июля 2013 г. Заменен дублированный код для отправки сигналов с параметрами
GAction 0e766b2d 18 июля 2013 г. Всплывающее меню процесса порта для GAction
97674c79 3 октября 2012 г. Избавьтесь от структуры
ProcData 38c5296c 3 июля 2011 г. Сделайте одинаковые отступы в исходных файлах.
Ничего из этого не изменилось с
SIGQUIT
наSIGTERM
, а последнее было до того, как был задан связанный вопрос.источник
15
? Возможно, в какой-то момент он был изменен, поэтому старый ответ может быть на 100% правильным по сравнению со старой версией.git grep 'SIGQUIT'
ничего не раскрывает. Ничего, связанного с сигналами, не найденоgit grep '>3<'
ни для одного. Я делаю вывод, что, скорее всего, gnome-system-monitor никогда не использовалSIGQUIT
.git grep
ищет только текущее дерево, а не всю историю. Я использовалgit blame
(фактически эквивалент Github), чтобы копать немного глубже, но все еще ничего.Ответ @hvd в основном правильный. Чтобы поддержать это еще больше,
init
процесс сначала отправитSIGTERM
процессам, когда вы выключаете компьютер, а затем с задержкой отправит,SIGKILL
если они еще не вышли. Процессы не могут обрабатывать / игнорироватьSIGKILL
.Чтобы дать немного больше подробностей, реальный ответ заключается в том, что вы не можете точно знать, что программа справится с этим.
SIGTERM
это самый обычный сигнал, используемый для вежливого запроса на выход из программы, но вся обработка сигнала зависит от того, что программа делает с сигналом.Иными словами, на основе других ответов, если у вас есть программа, написанная @Jos или @AlexGreg, то они, вероятно, будут обрабатывать,
SIGQUIT
но, возможно, нетSIGTERM
, и, следовательно, отправкаSIGTERM
будет менее "мягкой", чемSIGQUIT
.Я написал некоторый код, чтобы вы могли поиграть с ним самостоятельно. Сохранить ниже как
signal-test.c
, затем скомпилируйте сВы можете запустить его
./signal-test
и посмотреть, что происходит, когда вы отправляете различные сигналы с помощьюkillall -s <signal>
.Как он есть, код обрабатывает как SIGTERM, так и SIGQUIT изящно. Вы можете попробовать закомментировать строки
signal(SIG...
(используя a//
в начале строки), чтобы удалить обработчик сигналов, затем запустить и снова отправить сигналы. Вы должны увидеть эти разные результаты:в зависимости от того, обрабатываете ли вы сигналы или нет.
Вы также можете попробовать игнорировать сигналы:
Если вы сделаете это, то отправка
SIGTERM
ничего не даст, вам придется использоватьSIGKILL
для завершения процесса.Подробнее в
man 7 signal
. Обратите внимание, что использованиеsignal()
таким способом считается непереносимым - это намного проще, чем альтернатива!Еще одна второстепенная сноска - на Солярисе
killall
делается попытка уничтожить все процессы. Все они. Если вы запустите его как root, вы можете быть удивлены :)источник
pkill
. Другая причина в том, что он соединяется сpgrep
, что упрощает точную проверку того, какие процессы будут убиты, а какая сама семантика соответствия лучше, чемps | grep
.«Конец всего» будет
killall -s SIGQUIT [process name]
. Если вы хотите модное решение, определитеalias endall='killall -s SIGQUIT'
.источник
SIGQUIT
это как процессabort(3)
: он сбрасывает ядро, а затем убивает процесс. Это ни в коем случае не лучше / мягче / добрее, чемSIGTERM
по умолчаниюkillall
.SIGQUIT
(или даже лучшеSIGINT
), его можно обрабатывать более «мягко», чем этоSIGTERM
, но это зависит от приложения. Необработанные, любой из них вызывает немедленное прекращение.