Как мне завершить все процессы с одинаковыми именами более мягким способом, чем killall
? Я не хочу прерывать процессы, но оставляю им время для правильного выхода.
См. также:
В системном мониторе, в чем разница между Kill Process и Завершить процесс?
killall
по умолчанию отправляет SIGTERM
. Это уже - хороший подход, который оставляет приложения шансом вымыться после себя. "Идут уже, умирают, прямо сейчас!" подход должен отправить a SIGKILL
сигнал, который требует определения что как опция к killall
. От GNU C библиотека: сигналы завершения:
Макрос: международный SIGTERM
[...] Это - нормальный способ вежливо попросить, чтобы программа завершилась.
Вы связываетесь с вопросом о Системном мониторе GNOME. Это действительно использует SIGTERM
поскольку его "Конец обрабатывает" действие также (и я понимаю, что противоречу ответу на тот вопрос). Можно найти, что он в исходном коде проверяет себя:
<item>
<attribute name="label" translatable="yes">_End</attribute>
<attribute name="action">win.send-signal-end</attribute>
<attribute name="accel"><Primary>e</attribute>
<attribute name="target" type="i">15</attribute>
</item>
15 здесь являются числом сигнала. Сигнал 15 SIGTERM
. И Системный монитор использовал SIGTERM
задолго до того, как тот другой вопрос задали и ответили.
Просмотр представления GitHub git blame
, вот изменения, которые были внесены в то, как сигналы разъяснены в исходном коде Системного монитора GNOME:
383007f2 24 июля 2013 Замененный дублированный код для отправки сигналов с параметрами GAction
0e766b2d 18 июля 2013 всплывающее меню процесса Порта к GAction
97674c79 3 октября 2012 Избавляются от структуры ProcData
38c5296c 3 июля 2011 Делают универсальную форму добавления отступа через исходные файлы.
Ни один из них измененных от SIGQUIT
кому: SIGTERM
, и тот последний был до связанного вопроса, был спрошен.
"Закончите, все" были бы killall -s SIGQUIT [process name]
. Если Вы хотите необычное решение, определяете alias endall='killall -s SIGQUIT'
.
Ответ @hvd в основном корректен. Создать резервную копию этого еще больше, init
процесс сначала отправит SIGTERM
к процессам, когда Ваш закроют Ваш компьютер, затем после того, как отправит задержка SIGKILL
если они уже не вышли. Процессы не могут обрабатывать/игнорировать SIGKILL
.
Предоставлять немного больше подробную информацию, хотя, реальный ответ - то, что у Вас нет способа знать наверняка, что программа обрабатывает ее. SIGTERM
самый обычный сигнал состоит в том, чтобы использовать для того, чтобы вежливо попросить, чтобы программа вышла, но вся обработка сигнала зависит от программы, делающей что-то с сигналом.
Для помещения его другой путь, на основе других ответов, если бы Вам записал программу @Jos или @AlexGreg затем, они, по-видимому, обработали бы SIGQUIT
но возможно нет SIGTERM
, и следовательно отправка SIGTERM
было бы менее "мягким", чем SIGQUIT
.
Я написал некоторый код, таким образом, можно играть вокруг с ним сами. Сохраните ниже как signal-test.c
, затем скомпилируйте с
gcc -o signal-test signal-test.c
Можно затем выполнить его ./signal-test
, и посмотрите то, что происходит, когда Вы отправляете различные сигналы с killall -s <signal>
.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
int flag = 0;
void handle_signal(int s)
{
flag = s;
}
int main(int argc, char *argv[])
{
signal(SIGTERM, handle_signal);
signal(SIGQUIT, handle_signal);
while(flag == 0){
sleep(1);
}
printf("flag is %d\n", flag);
return flag;
}
В настоящий момент код обрабатывает и SIGTERM и SIGQUIT корректно. Вы могли попытаться комментировать строки signal(SIG...
(использующий a //
в начале строки) для удаления обработчика сигналов затем выполните и отправьте сигналы снова. Необходимо смочь видеть эти различные выводы:
$ ./signal-test
Terminated
$ ./signal-test
Quit (core dumped)
$ ./signal-test
flag is 15
$ ./signal-test
flag is 3
в зависимости от того, обрабатываете ли Вы сигналы или нет.
Вы могли также попытаться игнорировать сигналы:
signal(SIGTERM, SIG_IGN);
Если Вы делаете это затем отправка SIGTERM
ничего не сделает, необходимо будет использовать SIGKILL
закончить процесс.
Больше деталей в man 7 signal
. Отметьте то использование signal()
таким образом считается непортативным - это - партии, легче, чем альтернатива хотя!
Еще одна незначительная сноска - на Солярисе killall
попытки уничтожить все процессы. Все они. При выполнении его как корня затем, Вы можете быть удивлены :)
FROM ubuntu:15.10
так I' ll должны восстановить его, вероятно, все с нуля
– simPod
11 December 2016 в 12:44
FROM ubuntu:16.04
, это должно хорошо работать. – Marco Ceppi♦ 11 December 2016 в 12:42