Как убить все процессы, кроме PID 1?

"Вытеснение ядра - это метод, используемый в основном в монолитных и гибридных ядрах, где все или большинство драйверы устройств запускаются в пространстве ядра, при этом планировщику разрешается принудительно выполнять переключение контекста (т. е. заранее планировать; от имени работающего процесса с более высоким приоритетом) для драйвера или другой части ядра во время его выполнения, а не совместно. -оперативно ждать, пока драйвер или функция ядра (например, системный вызов) завершит свое выполнение и вернуть управление процессором планировщику.

У этого метода есть два основных преимущества в монолитных и гибридных ядрах, и один из основных критических замечаний по поводу монолитных ядер со стороны защитников микроядра, а именно: Драйвер устройства может войти в бесконечный цикл или другое неисправимое состояние, что приведет к сбою всей системы Некоторые драйверы и системные вызовы на монолитных ядрах выполняются медленно и не могут вернуть управление процессором планировщику или другой программе, пока они не завершат выполнение. "

https://en.wikipedia.org/wiki/Kernel_preemption

5
17.05.2016, 08:08
2 ответа

По крайней мере, в 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 должен работать на каждой системе при уничтожении большинства процессов, но список процессов, которые не подлежат уничтожению, может варьироваться от системы к системе.

6
27.01.2020, 20:38

Можно вам? да. Следует вам? почти при всех обстоятельствах нет. Но:

init явно игнорирует SIGTERM в Linux. Так что вы можете просто выполнить killall -TERM '*' .

0
27.01.2020, 20:38

Теги

Похожие вопросы