При уничтожении подпроцессов после того, как сценарий закончился или уничтожается

Путем контакта с поддержкой кажется, что моя установка КУБА не создавала часть GUI КУБА.

Фиксация должна была установить libqt4-dev и затем переустановить.

2
25.08.2016, 14:00
2 ответа

Оболочка определенно не будет самопроизвольно убивать свои подпроцессы - ведь фоновое задание должно выполняться в фоновом режиме и не заботиться о жизни своих родителей. (Интерактивная оболочка при некоторых обстоятельствах убивает свои подпроцессы при выходе - что не всегда желательно, поэтому nohup.)

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

jobs=()
trap '((#jobs == 0)) || kill $jobs' EXIT HUP TERM INT
…
subscript1 & jobs+=($!)
subscript2 & jobs+=($!)
…

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

#!/bin/sh
lock_file=$(mktemp)
exec 3<"$lock_file"
your_script
status=$?
exec 3<&-
fuser -k "$lock_file"
exit $status
2
27.01.2020, 22:13

Вы можете перехватить EXIT и отправить сигнал группе процессов сценария.

в Linux

trap 'kill -SIGTERM 0' EXIT

в FreeBSD

trap 'kill -15 -$$' EXIT

SIGKILL - единственный сигнал, при котором это не сработает, поскольку сценарий безоговорочно завершается.

0
27.01.2020, 22:13

Теги

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