В bash я могу получить идентификатор процесса (pid
) последнего подпроцесса через переменную $!
. Затем я могу убить этот подпроцесс до его завершения:Bash: Уничтожение всех процессов в подпроцессе
(sleep 5) & pid=$!
kill -9 $pid
Это работает как рекламируется. Если теперь я продолжу подпроцесс с дополнительными командами после sleep
, команда sleep
будет продолжена после того, как подпроцесс будет убит, хотя другие команды никогда не будут выполнены.
В качестве примера, рассмотрим следующее, который раскручивает подпроцесс и следить за его убийство с помощью ps
:
# Start subprocess and get its pid
(sleep 5; echo done) & pid=$!
# grep for subprocess
echo "grep before kill:"
ps aux | grep "$pid\|sleep 5"
# Kill the subprocess
echo
echo "Killing process $pid"
kill -9 $pid
# grep for subprocess
echo
echo "grep after kill:"
ps aux | grep "$pid\|sleep 5"
# Wait for sleep to finish
sleep 6
# grep for subprocess
echo
echo "grep after sleep is finished:"
ps aux | grep "$pid\|sleep 5"
Если я сохранить это в файл с именем filename
и запустить его, я получаю эту распечатку:
grep before kill:
username 7464 <...> bash filename
username 7466 <...> sleep 5
username 7467 <...> grep 7464\|sleep 5
Killing process 7464
grep after kill:
username 7466 <...> sleep 5
username 7469 <...> grep 7464\|sleep 5
grep after sleep is finished:
username 7472 <...> grep 7464\|sleep 5
, где несущественная информация из команды ps
заменяется на <...>
. Похоже, что kill
убил общее выполнение bash filename
, оставив sleep
бег.
Как я могу правильно убить весь подпроцесс?
Подсказка: он все еще там? –
@ KarolyHorvath Что еще там? –