4

user@host$ killall -9 -u user

Будет ли он определенно уничтожать все процессы, принадлежащие user (включая forkbombs)?

  1. Никакие новые процессы не порождаются user от других пользователей.
  2. Никакие user процессы не находятся в состоянии D-sleep и не могут быть уничтожены.
  3. Никакие процессы не пытаются обнаружить и ptrace или завершить этот запущенный killall (но они могут отследить или сделать что-то друг с другом)
  4. Существует ulimit который предотвращает слишком много процессов (но killall уже запущен и выделил свою память)

Например, если killall завершится без изменений и успешно ли это на 100%, что с этим uid не осталось никаких процессов? Если нет, то как это сделать правильно (со стандартными командами и без корневого доступа).

Удастся ли SysRq+I определенно убить все (даже тиражировать)?

2 ответа2

3

Нет. killall сначала перечисляет все процессы , которые должны быть уничтожены, а затем перебирает этот список и убивает их. Если у вас запущена forkbomb, после того, как killall убьёт один из своих процессов, очень вероятно, что другой процесс немедленно вернет PID, который только что был освобожден, но killall считает, что он уже убил этот процесс, поэтому фактически ничего не произойдет.

Вы должны использовать ulimit, если для вас проблема с вилкой. Ограничьте число процессов, например, до 128, и вилочная бомба молча умрет или прекратит расширение, в зависимости от того, как она была написана. В любом случае, это не представляет опасности для других пользователей этой системы.

0

Недавно мне пришлось иметь дело со многими вилками на общедоступном сервере CTF. У меня уже были ulimits с pam_limits. Для большинства вилочных бомб вы можете сделать это:

killall -v -STOP -u mallory; killall -v -9 -u mallory

Сигнал STOP останавливает процессы, поэтому killall имеет возможность перечислить их все и уничтожить.

Но для типичных python-бомб, как только достигнут предел, процесс разветвления завершится с исключением. Это означает, что если ваш ulimit на nproc равен 500, вы будете иметь устойчивое состояние около 500 процессов Python, но каждый процесс будет работать только в течение не более миллисекунд. Когда я попробовал описанный выше подход, к тому времени, когда killall отправил какой-либо данный процесс python сигнал, он уже завершился.

Самая важная вещь, которую я узнал, пришла от killall(1):

   -g, --process-group
          Kill the process group to which the process  belongs.  The  kill
          signal  is  only sent once per group, even if multiple processes
          belonging to the same process group were found.

Таким образом, это, вероятно, будет делать то, что вы хотите:

killall -9 -v -g -u mallory

В качестве альтернативы, вы можете вместо этого сделать killall -STOP проверить текущие процессы и убить их на досуге. Вы можете использовать сигнал CONT чтобы возобновить их, если это необходимо.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .