По-перше, це не характерно для bash. ATT ksh, dash та zsh поводяться однаково: вони ігнорують SIGTERM та SIGQUIT під час випуску командного рядка; що стосується mksh, він також не виходить, але трактує їх як SIGINT.
Як посібник ksh, так і посібник bash виправдовують ігнорування SIGTERM у цих термінах:
щоб kill 0
не вбивати інтерактивну оболонку
kill 0
вбиває всі процеси в групі процесів, в якій знаходиться оболонка. У двох словах, група процесів складається з усіх процесів, що працюють на передньому плані на терміналі, або всіх процесів у фоновому режимі або призупиненому завданні.
Точніше, це відбувається в сучасних оболонках з контролем роботи . У таких оболонках kill 0
це не буде корисним, оскільки оболонка знаходиться у власній групі процесів. Старіші оболонки (або сучасні оболонки після set +m
) не створювали групи процесів для фонових команд. Таким чином, ви можете використовувати команду, kill 0
щоб знищити всі фонові команди, не виходячи з системи kill 0
.
Однак є й інші подібні ситуації, коли зробити захисну оболонку корисною. Розглянемо випадок, коли у вас є процеси підключення терміналу, і ви хочете вбити їх, не виходячи з системи. У багатьох системах є такий інструмент, pkill
який дозволяє вбивати процеси, що працюють на терміналі. Ви можете запустити pkill -t $TTY
або pkill -QUIT -t $TTY
вбити всі процеси, що працюють на поточному терміналі, крім оболонки, яка ігнорує сигнал.
Оболонка зазвичай відмирає або коли користувач виходить з неї (з командою типу exit
або logout
), або коли її термінал сигналізує про кінець вводу (користувач може викликати це натисканням Ctrl+ D) або зовсім відходить. В останньому випадку оболонка приймає сигнал SIGHUP, і він не ігнорує цей.
Для вашого випадку виходу з сеансу X kill -15 -1
це зробить, оскільки він вбиває емулятор терміналу, через що оболонка отримує SIGHUP. Насправді достатньо вбити X-сервер, але для цього потрібно знайти його ідентифікатор процесу. Якщо ви хочете, щоб ця сама команда працювала над текстовим сеансом, ви можете використовувати kill -15 -1; exit
. Це досить небезпечна команда все одно мати під рукою.
¹ Це, мабуть, не згадується в посібниках з оболонками; це особливість базового системного виклику. Він прямо згадується в специфікації POSIX .
² Сьогодні, щоб зробити це, запустіть, jobs -l
щоб переглянути список завдань із їх ідентифікаційною групою процесорів, а потім kill -123 -456 …
вбити групи процесів.
/bin/kill
або вбудована оболонка? Якщо останнє, я здогадуюсь, що оболонка не вб'є себе власним вбудованим.