"Вытеснение ядра - это метод, используемый в основном в монолитных и гибридных ядрах, где все или большинство драйверы устройств запускаются в пространстве ядра, при этом планировщику разрешается принудительно выполнять переключение контекста (т. е. заранее планировать; от имени работающего процесса с более высоким приоритетом) для драйвера или другой части ядра во время его выполнения, а не совместно. -оперативно ждать, пока драйвер или функция ядра (например, системный вызов) завершит свое выполнение и вернуть управление процессором планировщику.
У этого метода есть два основных преимущества в монолитных и гибридных ядрах, и один из основных критических замечаний по поводу монолитных ядер со стороны защитников микроядра, а именно: Драйвер устройства может войти в бесконечный цикл или другое неисправимое состояние, что приведет к сбою всей системы Некоторые драйверы и системные вызовы на монолитных ядрах выполняются медленно и не могут вернуть управление процессором планировщику или другой программе, пока они не завершат выполнение. "
По крайней мере, в Linux:
kill -- -1
Отправит сигнал SIGTERM каждому процессу, который может, кроме вызывающего (так что процесс, выполняющий этот kill
, которая может быть оболочкой, если kill
встроена в нее (обычно она есть в оболочках POSIX) или процесс, выполняющий отдельную команду kill
) и процесс pid 1.
Обратите внимание, что это делается как часть системного вызова kill ()
, поэтому он более надежен, чем использование таких команд, как pkill
или killall
(или традиционная команда killall
, которая иногда встречается как killall5
в Linux, традиционно используемая для этого), которая сначала перечисляет процессы, а затем убивает их, поскольку они пропустят процессы, которые были созданы в среднее время.
Это звучит именно так, как вы хотите.
trap '' TERM # ignore SIGTERM ourselves though it wouldn't be needed
# in most shells
kill -- -1
sleep 1 # leave processes some time to exit cleanly on SIGTERM
kill -s KILL -- -1 # removes the remaining processes or those
# that have started since without giving them
# a chance to clean-up.
exit
Должно уничтожить все, кроме процесса с идентификатором 1.
Вы можете поэкспериментировать с этим, запустив:
unshare --mount-proc -mpf
Это запускает оболочку в отдельном пространстве имен pid и mount (с новым / proc (как используется ps
/ pkill
/ killall
)), где у этой оболочки pid 1.
Вне Linux, kill - -1
должен работать на каждой системе при уничтожении большинства процессов, но список процессов, которые не подлежат уничтожению, может варьироваться от системы к системе.
Можно вам? да. Следует вам? почти при всех обстоятельствах нет. Но:
init
явно игнорирует SIGTERM в Linux. Так что вы можете просто выполнить killall -TERM '*'
.