Киндер / более мягкая / тонкая эквивалентная альтернатива killall (например, & ldquo; endall & rdquo;)?

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

http://dev.gentoo.org/~robbat2/patches/3.13-libata-disable-disks-by-param.patch

Очень легко применимо ко многим ядрам (строка над ним было добавлено 2013-05-21 / v3.10-rc1 *, но можно безопасно применять вручную без этой строки).

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

2 ответа

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

$ ./signal-test
Terminated

$ ./signal-test
Quit (core dumped)

$ ./signal-test
flag is 15

$ ./signal-test
flag is 3

в зависимости от того, обрабатываете ли вы сигналы или нет.

Вы также можете попробовать игнорировать сигналы:

[ f4]

Если вы это сделаете, то отправка SIGTERM ничего не даст, вам придется использовать SIGKILL для завершения процесса.

Подробнее в man 7 signal. Обратите внимание, что использование signal() таким образом считается не переносным - это намного проще, чем альтернатива!

Еще одна небольшая сноска - на Solaris killall пытается убить все процессы. Все они. Если вы запустите его как root, вы можете быть удивлены:)

5
ответ дан 23 May 2018 в 17:17
  • 1
    Это одна из причин, по которой я предпочитаю pkill. Другая причина заключается в том, что он соединяется с pgrep, что упрощает проверку того, какие процессы будут убиты, а какая из них лучше соответствует семантике, чем ps | grep. – Random832 21 September 2015 в 23:40

«Конец всех» будет killall -s SIGQUIT [process name]. Если вы хотите причудливое решение, определите alias endall='killall -s SIGQUIT'.

2
ответ дан 23 May 2018 в 17:17
  • 1
    SIGQUIT похож на процесс abort(3): он сбрасывает ядро, а затем убивает процесс. Это никоим образом не лучше / мягче / добрее, чем SIGTERM, по умолчанию для killall. – Ruslan 21 September 2015 в 17:02
  • 2
    Для процесса, который обрабатывает сигналы, SIGQUIT (или даже лучше, SIGINT) может обрабатываться более «мягко», чем SIGTERM, но это зависит от приложения. Не обрабатывается, любой из них вызывает немедленное прекращение. – R.. 21 September 2015 в 18:33
  • 3
    Это отличная идея, если вам нравится очищать основные файлы на вашем диске. – Nate Eldredge 22 September 2015 в 02:25
  • 4
    Я хотел бы повторить повторение пункта @R ..: Unhandled, any of them cause immediate termination. Сигналы - это соглашение на конце приложения. То, что они на самом деле делают , зависит от приложения, хотя ядро ​​обрабатывает их несколько иначе. – Qix 22 September 2015 в 05:30
  • 5
    @Qix: Одна вещь, которая зависит от одного сигнала, заключается в том, создает ли он основной файл или нет по умолчанию (когда он не обрабатывается приложением). Вероятно, предпочтительнее использовать сигналы, которые не генерируют файлы ядра. – R.. 22 September 2015 в 06:05

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

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