Я хочу прервать цепочку процессов, например
PID PPID
100 XXX
101 100
102 101
При использовании pkill -P 100
PID 100 и 101 умирают, как и ожидалось, но 102 присваивается init, поскольку это PPID.
Как заставить pkill продолжать завершать связанные процессы за пределами непосредственных потомков процесса?
решение1
pkill
делает именно то, что вы ему сказали: он завершает процессы, родительский процесс которых равен 100. А не процессы, родительский процесс которых равен 100.
Ни Linux, pkill
ни FreeBSD не имеют возможности пройти по дереву процессов. Вы можете вызвать pstree -l
и проанализировать его вывод.
Помните, что если A разделяет B, B разделяет C, а затем B умирает, то не остается родительско-дочерних связей, которые могли бы соединить A и C.
Возможно, есть способ остановить все эти процессы, но будьте осторожны, так как это может привести к перегрузке.
Если вы передадите отрицательный идентификатор процесса kill
, это уничтожит весь процесс.группа процессов. Это атомарно, поэтому работает даже если один из процессов разветвляется, как раз когда вы работаете kill
. Это убивает только те процессы, которые не поместили себя в свою собственную группу, а также убивает родительский процесс и другие, если они находятся в той же группе процессов. Запустите, ps -o pgid …
чтобы увидеть идентификатор группы процессов.
Если все процессы, которые вы хотите завершить, имеют открытый определенный файл, вы можете использовать fuser -k /some/file
для завершениявсепроцессы, в которых открыт этот файл.
Другой вариант в Linux —запускать процессы в их собственном пространстве имен PID. Затем вы можете уничтожить все пространство имен, уничтожив псевдо-PGID -1 из пространства имен.