Как передать PID подпроцесса родительскому процессу в сценарии оболочки bash?

Когда Вы соединяетесь с удалить машиной через ssh с включенной передачей X11, ssh на сервере создает a .Xauthority файл в корневом каталоге пользователя. Поскольку ssh прислушивается к X11 на сокете TCP, любой может соединиться. Поскольку любой может соединиться, нам нужен некоторый способ предотвратить просто любого от использования Вашего дисплея. Это сделано с этим .Xauthority файл. Файл содержит "cookie", который представлен серверу X11, который проверяет, что клиенту нужно разрешить соединиться.

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

4
22.05.2015, 14:16
4 ответа

каталог , как файл, имеет inode, связанный с ним:

307% MKDIR ABC

308% LS -I 11997708 A 11997709 B 11997710 C

inode - это структура данных, которая содержит информацию о каталоге или файле. Каждый каталог и файл имеет один. Подумайте об этом как адрес (номер индекса действительно).

Если я нахожусь в номере inode 11997708 и в другой оболочке (или в той же оболочке, как я собираюсь сделать) Удалить каталог А, затем воссоздайте его и LS inode:

309% CD A

310% RMDIR ../A

311% mkdir ../a

312% ls -i ..

11997720 A 11997709 B 11997710 C

Это отличается, поэтому, если он попытается создать файл в удаленном каталоге A:

313% Touch Touch

Touch: не может прикоснуться к «это»: нет такого файла или каталога

, потому что каталог я в больше не связан с inode 11997720 - Итак, где я больше не имеет законного адреса / индекса - inode. Таким образом, ошибка.

-121--31746-

PKILL может убивать процессы :

pkill process1 && pkill sub_process1

должен выполнить работу.

0
27.01.2020, 21:00

Вы могли бы убить -TERM вас процессную группу . Если ваш скрипт вызывается из оболочки, то его собственная группа процессов будет равна PID скрипта:

kill -TERM -$$

Если же скрипт вызывается в ином случае, то идентификатор его группы процессов может быть не равен PID:

kill -TERM -`ps -o pgid $$ | tail -1`

Вам не следует убивать -9 в скрипте или программе, если только вы не дадите программе справедливый шанс с помощью убить -TERM.

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

0
27.01.2020, 21:00

Так как вы пометили это как Linux: pgrep / pkill на помощь:

PID_OF_SUB_PROCESS1=$( pgrep -P $PID_OF_PROCESS1 )
pkill -P $PID_OF_PROCESS1
2
27.01.2020, 21:00

Вы можете получить идентификатор процесса процесса , запустив его как фоновый процесс.

./process1 &
pid1=$!
wait "$pid1"

Команда wait ожидает завершения работы process1 (но не его подпроцессов), как в исходном скрипте. Обратите внимание, что в вашем исходном сценарии нет process1 , который нужно убить в конце: команда ./ process1 завершается, только когда завершается process1 . Возможно, у этого процесса есть дочерний процесс с тем же именем (т.е. программа могла вызывать fork , но не execve ). Если вы хотите продолжить выполнение сценария, как только запустится сам process1 , опустите строку wait .

Если у вас есть команда pkill , это удобный способ убить всех дочерних процессов процесса.Обратите внимание, что процесс должен быть запущен или должен быть зомби , в противном случае идентификатор родительского процесса дочернего процесса будет сброшен на 1, и вы больше не сможете отслеживать их таким образом. Пока вы не вызываете wait в своем скрипте, идентификатор фонового процесса будет оставаться действительным.

./process1 &
pid1=$!
…
pkill -9 -P "$pid1"
kill -9 "$pid1"

Другой способ рекурсивного отслеживания процесса, его дочерних и их дочерних процессов - это отслеживание группы процессов . У потомков процесса будет одна и та же группа процессов, если они явно не изменят ее. В Linux вы можете использовать команду setsid для запуска программы в ее собственной группе процессов. Группа процессов идентифицируется идентификатором исходного процесса. Чтобы убить все процессы в группе процессов, передайте отрицательный идентификатор группы процессов в kill .

setsid ./process1 &
pgid1=$!
…
kill -9 "-$pgid1"

Еще один способ отслеживать процессы - заставить их открывать файл. Это работает до тех пор, пока процессы не закрывают файлы, поэтому это может не сработать для программы, предназначенной для работы в качестве демона. Используйте команду fuser , чтобы остановить процессы, у которых открыт файл.

tmpfile=$(mktemp)
process1 <"$tmpfile"
…
fuser -k -9 "$tmpfile"
0
27.01.2020, 21:00

Теги

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