Путем контакта с поддержкой кажется, что моя установка КУБА не создавала часть GUI КУБА.
Фиксация должна была установить libqt4-dev и затем переустановить.
Оболочка определенно не будет самопроизвольно убивать свои подпроцессы - ведь фоновое задание должно выполняться в фоновом режиме и не заботиться о жизни своих родителей. (Интерактивная оболочка при некоторых обстоятельствах убивает свои подпроцессы при выходе - что не всегда желательно, поэтому 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
Вы можете перехватить EXIT и отправить сигнал группе процессов сценария.
в Linux
trap 'kill -SIGTERM 0' EXIT
в FreeBSD
trap 'kill -15 -$$' EXIT
SIGKILL
- единственный сигнал, при котором это не сработает, поскольку сценарий безоговорочно завершается.