Коротка відповідь : Відправити SIGTERM
, через 30 секунд, SIGKILL
. Тобто надсилайте SIGTERM
, почекайте трохи (це може відрізнятися залежно від програми, можливо, ви краще знаєте свою систему, але цілком достатньо 5–30 секунд. При вимкненні машини ви можете побачити, що вона автоматично чекає до 1:30 с. Чому все-таки поспішати?), То надішліть SIGKILL
.
Розумну відповідь : SIGTERM
, SIGINT
, SIGKILL
Це більше , ніж достатньо. Процес дуже ймовірно закінчиться раніше SIGKILL
.
Довгий відповідь : SIGTERM
, SIGINT
, SIGQUIT
, SIGABRT
,SIGKILL
Це непотрібно, але принаймні ви не вводите в оману процес щодо вашого повідомлення. Всі ці сигнали дійсно означає , що ви хочете , щоб процес зупинити то , що він робить і вихід.
Незалежно від того, яку відповідь ви вибрали з цього пояснення, майте це на увазі!
Якщо ви надсилаєте сигнал, який означає щось інше, процес може обробляти це по-різному (з одного боку). З іншого боку, якщо процес не справляється з сигналом, неважливо, що ви все-таки надішлете, процес все одно завершиться (звичайно, коли дію за замовчуванням потрібно завершити).
Отже, ви повинні мислити як себе програмістом. Чи кодували ви обробник функцій для, скажімо, SIGHUP
виходу з програми, яка з чимсь з'єднується, або ви б зациклювали її, щоб спробувати підключитися знову? Це головне питання тут! Ось чому важливо просто надсилати сигнали, що означають те, що ви плануєте.
Майже дурна довга відповідь :
Наведена нижче таблиця містить відповідні сигнали та дії за замовчуванням, якщо програма не справляється з ними.
Я замовив їх у тому порядку, який я пропоную використовувати (до речі, я пропоную вам використати розумну відповідь , а не цю тут), якщо вам дійсно потрібно спробувати їх усі (було б цікаво сказати, що таблиця впорядкована з точки зору руйнування, яке вони можуть спричинити, але це не зовсім так).
Сигнали зірочкою (*) НЕ рекомендуються. Важливим у цьому є те, що ви можете ніколи не знати, що запрограмовано робити. Спеціально SIGUSR
! Це може почати апокаліпсис (це безкоштовний сигнал для програміста робити все, що він / вона хоче!). Але, якщо не обробляти АБО, то в малоймовірному випадку її обробку припиняють, програма припиняє роботу.
У таблиці сигнали із параметрами за замовчуванням для завершення та створення дампа ядра залишаються в кінці, безпосередньо перед цим SIGKILL
.
Signal Value Action Comment
----------------------------------------------------------------------
SIGTERM 15 Term Termination signal
SIGINT 2 Term Famous CONTROL+C interrupt from keyboard
SIGHUP 1 Term Disconnected terminal or parent died
SIGPIPE 13 Term Broken pipe
SIGALRM(*) 14 Term Timer signal from alarm
SIGUSR2(*) 12 Term User-defined signal 2
SIGUSR1(*) 10 Term User-defined signal 1
SIGQUIT 3 Core CONTRL+\ or quit from keyboard
SIGABRT 6 Core Abort signal from abort(3)
SIGSEGV 11 Core Invalid memory reference
SIGILL 4 Core Illegal Instruction
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
Тоді я запропонував би для цього майже дурного довгого відповіді :
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGQUIT
, SIGABRT
,SIGKILL
І, нарешті,
Безумовно Дурна Довга Довга Відповідь :
Не пробуйте це вдома.
SIGTERM
, SIGINT
, SIGHUP
, SIGPIPE
, SIGALRM
, SIGUSR2
, SIGUSR1
, SIGQUIT
, SIGABRT
, SIGSEGV
, SIGILL
, SIGFPE
І , якщо нічого не виходило, SIGKILL
.
SIGUSR2
слід спробувати раніше, SIGUSR1
тому що нам краще, якщо програма не справляється з сигналом. І це набагато більше шансів для нього, SIGUSR1
якщо він обробляє лише один з них.
До речі, вбивство : не помилково направляти SIGKILL
на процес, як зазначалося в іншій відповіді. Ну, подумайте, що відбувається, коли ви надсилаєте shutdown
команду? Це спробує SIGTERM
і SIGKILL
тільки. Чому, на вашу думку, це саме так? І навіщо вам будь-які інші сигнали, якщо сама shutdown
команда використовує лише ці два?
Тепер, повернувшись до довгої відповіді , це хороший підказка:
for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done
Він перебуває в режимі сну протягом 30 секунд між сигналами. Навіщо ще вам потрібен oneliner ? ;)
Крім того , рекомендується: спробуйте тільки з сигналами 15 2 9
від розумної відповіді .
безпека : зніміть другу, echo
коли будете готові до роботи. Я називаю це своїм dry-run
для онлайнерів . Завжди використовуйте його для тестування.
Сценарій вдячно вбив
Насправді мене це питання настільки заінтригувало, що я вирішив створити невеликий сценарій для цього. Будь ласка, не соромтеся завантажувати (клонувати) його тут:
Посилання GitHub на сховище Killgracefully