pkill не убивает процессы, предшествующие непосредственным потомкам процесса

pkill не убивает процессы, предшествующие непосредственным потомкам процесса

Я хочу прервать цепочку процессов, например

PID  PPID
100  XXX
101  100
102  101

При использовании pkill -P 100PID 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 из пространства имен.

Связанный контент