Когда Вы соединяетесь с удалить машиной через ssh с включенной передачей X11, ssh на сервере создает a .Xauthority
файл в корневом каталоге пользователя. Поскольку ssh прислушивается к X11 на сокете TCP, любой может соединиться. Поскольку любой может соединиться, нам нужен некоторый способ предотвратить просто любого от использования Вашего дисплея. Это сделано с этим .Xauthority
файл. Файл содержит "cookie", который представлен серверу X11, который проверяет, что клиенту нужно разрешить соединиться.
Пропуск всех подробностей, если Вы копируете это .Xauthority
файл к корневому каталогу Вашего целевого пользователя (и дают им владение), необходимо смочь соединиться.
каталог , как файл, имеет 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
должен выполнить работу.
Вы могли бы убить -TERM
вас процессную группу .
Если ваш скрипт вызывается из оболочки, то его собственная группа процессов будет равна PID скрипта:
kill -TERM -$$
Если же скрипт вызывается в ином случае, то идентификатор его группы процессов может быть не равен PID:
kill -TERM -`ps -o pgid $$ | tail -1`
Вам не следует убивать -9
в скрипте или программе, если только вы не дадите программе справедливый шанс с помощью убить -TERM
.
Делая , найдите pid и убейте его
, вы попадаете в условия гонки (хотя они нечасто демонстрируются, если только ваш ящик не порождает процессы, как сумасшедшие). pid
являются движущейся мишенью, и если пид, который вы убиваете, является вашим ребенком, и вы не удостоверились, что пид не будет переработан, не дождавшись его (что-то, что вы едва ли сможете сделать при бэше, насколько я знаю), вы не можете быть на 100% уверены, что убиваете правильный процесс (между поиском пида и убийством, процесс, возможно, умер, и другой, возможно, взял пид).
Так как вы пометили это как Linux: pgrep
/ pkill
на помощь:
PID_OF_SUB_PROCESS1=$( pgrep -P $PID_OF_PROCESS1 )
pkill -P $PID_OF_PROCESS1
Вы можете получить идентификатор процесса процесса
, запустив его как фоновый процесс.
./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"