Коротка відповідь : Відправити 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