Выход из скрипта Bash при выходе из sudo

Я пытаюсь запустить несколько подпрограмм из сценария bash, а затем дождаться, когда кто- нибудь из них уйдет, прежде чем выйти из другого и выйти из сценария.

 CMD1PID =
 CMD2PID =

 exit_trap () {
     эхо "выход из ловушки: убийство рабочих мест ..." 
     sudo kill $ CMD1PID $ CMD2PID
     Выход
 }

 set -bm
 trap exit_trap EXIT INT TERM

 sudo cmd1 --args &
 CMD1PID = $?

 sudo cmd2 --args &
 CMD2PID = $?

 wait $ CMD1PID $ CMD2PID

(Для справки это GNU bash, version 4.2.37(1)-release (arm-unknown-linux-gnueabi) в Debian Weezy)

К сожалению, это не работает должным образом. Я пробовал несколько вариантов, таких как:

  • используя фигурные скобки вокруг команд и явно убивая процесс оболочки после этого, то есть { cmd1 --args ; kill -USR1 $$ ; } & { cmd1 --args ; kill -USR1 $$ ; } & { cmd1 --args ; kill -USR1 $$ ; } & или аналогичный, а затем улавливание на USR1
  • используя kill 0 чтобы убить все еще запущенные команды при выходе
  • улавливание CHLD – это имеет тот недостаток, что я не могу sleep между командами, если мне это нужно, что в конечном итоге мне нужно будет сделать.

… но проблемы, с которыми я сталкиваюсь, – это:

  • Убивание одной из команд не приводит к тому, что родительский Bash-процесс должен выйти и / или убить другую команду
  • Убивание родительского процесса Bash не приводит к тому, что обе команды будут убиты

Я подозреваю, что, возможно, мое требование использовать sudo отключает меня, так как другие люди в других сценариях, похоже, имеют удачу с похожими сценариями. Есть ли хороший способ сделать то, что я пытаюсь сделать в bash?

У вас есть две проблемы: вам нужно определить, когда закончится какой-нибудь интересный ребенок, и вам нужно убить всех из них.

Первое означает, что вы не можете использовать встроенное «wait», потому что это будет ждать всех детей (или всех перечисленных, если они есть), а не для каких-либо . Ваше предложение на основе USR1 хорошо подходит для этого (и для EXIT).

Второе намного сложнее: поскольку вы используете sudo, у вас фактически нет разрешения отправлять сигнал процессам; для отправки сигнала процессу либо ваш идентификатор пользователя должен совпадать, либо вы должны быть root.

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