Есть ли способ вызвать закрытие одной программы путем закрытия другой? Возможно, скрипт оболочки?

Есть ли способ вызвать закрытие одной программы путем закрытия другой? Возможно, скрипт оболочки?

Итак, моя ситуация такова: я создал лаунчер, привязки клавиш и псевдоним, который одновременно открывает GLava и CMus в раскрывающемся терминале, используя этот скрипт оболочки:

    #!/bin/bash

c=$(ps -e | grep -c xfce4-terminal)

if [ $c -gt 0 ]
    then
        xfce4-terminal --tab --drop-down -x cmus | glava --desktop & $1
    else
        xfce4-terminal --drop-down -x cmus | glava --desktop & $1
fi

Это идеально и великолепно, но есть одна маленькая проблема. Я бы очень хотел, чтобы обе программы также ЗАКРЫВАЛИСЬ одновременно. Есть ли способ сделать так, чтобы завершение одной программы запускало другую? В частности, если у меня открыты CMus и GLava, я бы хотел иметь возможность закрыть CMus (скажем, просто нажав «q» и выйдя из CMus или закрыв терминал, или убив программу, ИЛИ с помощью специальной привязки клавиш и т. д.) и чтобы GLava также немедленно закрылась/завершила работу. В настоящее время у меня есть отдельная привязка клавиш для pkill GLava после того, как я закрыл CMus, что, я полагаю, работает нормально, но, безусловно, немного более неуклюже, чем мне бы хотелось. Может быть, есть способ, чтобы GLava запускалась только при запущенном CMus, что-то вроде белого списка, может быть? Простая оболочка, которая закрывает обе программы, которые я могу связать? Или, может быть, есть другая мысль? Я открыт для любых предложений, будучи новичком, которым я являюсь. Любая помощь будет высоко оценена.

решение1

Простой способ позволить процессам общаться —сигналы.

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

Учитывать:

cat proc_a.sh
#!/bin/bash
echo "Load program 1 as : $$"
sleep 1d

cat proc_b.sh
#!/bin/bash
echo "Load program 2 as : $$"
sleep 1d

Теперь создадим оболочку для запуска двух других процессов:

cat wrap.sh
#!/bin/bash
./proc_a.sh
a_pid=$!

./proc_b.sh
b_pid=$!

cleanup() {
    echo "Kill process a $a_pid"
    kill $a_pid

    echo "Kill process b $b_pid"
    kill $b_pid

    echo "Kill me : $$"
    kill $$
}

trap cleanup SIGINT

while :;do
   sleep 1d
done

если вы запустите ./wrap.sh, а затем отправите SIGINT(НажмитеCTRL-C) Вы можете увидеть это:

Load program 1 as : 27141
Load program 2 as : 27142
^CKill a process a 27141
kill process b 27142
Kill me : 27140
Terminato

Недостатком этого является то, чтоВ ЛЮБОЙ МОМЕНТесли вы закроете один процесс, то и другой тоже будет закрыт, за исключением того факта, что теперь вам нужно будет убить wrapвместо одного из процессов.

Чтобы избежать этого недостатка, вы можете запустить программу xfce из встроенного скрипта и установить обработчик сигнала непосредственно здесь. Когда одна из двух получит сигнал закрытия, она найдет pid другой программы xfce-wrapper-program и завершит ее.

решение2

Итак, я наконец-то добрался до того, чтобы попробовать это, и, как вы наверняка знаете, идея и реализация сценария надежны. Но, к сожалению, это не то, что я ищу. Что мне точно нужно, так это что-то, возможно, сценарий, который будет запускать закрытие вторичной, определенной программы, когда я закрываю первую определенную программу. Допустим, я закончил слушать музыку в CMus. Я хотел бы иметь возможность закрыть эту программу и заставить вторичную программу также закрыться. Что-то вроде конвейера, но для закрытия программы. Возможно ли это?

Связанный контент