По-перше, це не характерно для 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або вбудована оболонка? Якщо останнє, я здогадуюсь, що оболонка не вб'є себе власним вбудованим.