Зомби в баш

11

Кажется, Баш не создает зомби. Похоже, что процессы сразу же пожинаются, когда их убивают.

Могу ли я сделать Баш сделать зомби?


Почему я спрашиваю:

Я хотел бы иметь возможность безопасно убить дочерний процесс или безопасно, kill -9если он не умирает в течение определенного периода времени, но я не хочу случайно уничтожать процесс, который не является моим дочерним процессом. Процессы зомби обычно делают его очень легким и безопасным.

PSkocik
источник
1
Может быть, другая идея ... если вы действительно хотите защитить себя от уничтожения внешних процессов, проверьте cgroups. Вызовите unshareдля создания пространства имен PID, чтобы из этого дерева процессов внешние процессы были изолированы и недоступны.
Орион
Используйте управление заданиями (например, kill -KILL %nгде nномер задания и т. Д.) Вместо того, чтобы пытаться его обойти.
Номинальное животное
Отличный вопрос! Альтернативный подход к «почему вы спрашиваете», хотя: вы рассмотрели timeoutкоманду?
Wildcard

Ответы:

13

Чтобы сделать процесс зомби:

$ (sleep 1 & exec /bin/sleep 10)

Это заменит оболочку, которая работает sleep 1с /bin/sleep 10этим, не будет знать, что sleep 1процесс завершен, поэтому создание зомби в течение 10 секунд.


Я не уверен, что вы ожидаете от убийства зомби. Процесс зомби уже был мертв, вы не можете убить его.

На самом деле, вы можете заставить процессы зомби исчезать, но убивая их родителей, а не сами процессы зомби.

cuonglm
источник
Полученные ПИДы перерабатываются. Смысл зомби в том, что они резервируют PID, пока родитель не признает смерть своего ребенка, ожидая его. Без этого убийство pid может привести к случайной жертве.
PSkocik
1
В C вы можете быть уверены, что не станете случайной жертвой, когда убьете своего ребенка, потому что, пока вы не дождетесь этого ребенка, PID этого ребенка не может быть переработан. Я бы хотел иметь такую ​​же гарантию в оболочке.
PSkocik
3

Не очень интересный ответ:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>
yaegashi
источник
Как это процесс зомби? Это просто остановилось. И $BASHPIDэто $$я думаю.
Габор Чарди
$BASHPID это не то же самое $$. Попробуйте следующий код: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Вы можете найти больше информации в man bash.
Алекс Барановский