Киндер / нежнее / тоньше эквивалентная альтернатива killall (например, "endall")?

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


См. также:

Как убить процессы в Ubuntu?

В системном мониторе, в чем разница между Kill Process и Завершить процесс?

Почему killall (иногда?) Нужно применять дважды?

tl; dr

17
задан 23 May 2017 в 15:39

3 ответа

1. 'killall', уже хороший (SIGTERM)

killall по умолчанию отправляет SIGTERM. Это уже - хороший подход, который оставляет приложения шансом вымыться после себя. "Идут уже, умирают, прямо сейчас!" подход должен отправить a SIGKILL сигнал, который требует определения что как опция к killall. От GNU C библиотека: сигналы завершения:

Макрос: международный SIGTERM

[...] Это - нормальный способ вежливо попросить, чтобы программа завершилась.


2. "Конец системного монитора обрабатывает" одинаково хороший (SIGTERM, также)

Вы связываетесь с вопросом о Системном мониторе GNOME. Это действительно использует SIGTERM поскольку его "Конец обрабатывает" действие также (и я понимаю, что противоречу ответу на тот вопрос). Можно найти, что он в исходном коде проверяет себя:

data/menus.ui:

<item>
  <attribute name="label" translatable="yes">_End</attribute>
  <attribute name="action">win.send-signal-end</attribute>
  <attribute name="accel">&lt;Primary&gt;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, и тот последний был до связанного вопроса, был спрошен.

43
ответ дан 24 May 2017 в 01:39
  • 1
    Если Вы перемещаетесь в FROM ubuntu:16.04, это должно хорошо работать. – Marco Ceppi♦ 11 December 2016 в 12:42

"Закончите, все" были бы killall -s SIGQUIT [process name]. Если Вы хотите необычное решение, определяете alias endall='killall -s SIGQUIT'.

2
ответ дан 24 May 2017 в 01:39
  • 1
    .. продолженный, Но я уже попытался делать это прежде, чем отправить вопрос, но это не помогло. Не уверенный то, что, является проблемой, которая использует так большую часть ЦП. – Chand Prakash 25 December 2016 в 10:29

Ответ @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 попытки уничтожить все процессы. Все они. При выполнении его как корня затем, Вы можете быть удивлены :)

5
ответ дан 24 May 2017 в 01:39
  • 1
    Это - упрощенный пример, к сожалению. Мой dockerfile основан на двух основных изображениях, не сохраняемых мной. Нижняя часть каждый FROM ubuntu:15.10 так I' ll должны восстановить его, вероятно, все с нуля – simPod 11 December 2016 в 12:44

Другие вопросы по тегам:

Похожие вопросы: