¿Hay alguna manera de provocar el cierre de un programa cerrando otro? ¿Quizás un script de shell?

¿Hay alguna manera de provocar el cierre de un programa cerrando otro? ¿Quizás un script de shell?

Entonces, mi situación es la siguiente: he creado un iniciador, combinaciones de teclas y un alias que abre GLava y CMus en una terminal desplegable al mismo tiempo, usando este script de shell:

    #!/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

Es perfecto y glorioso, excepto por un pequeño problema. Me gustaría mucho que ambos programas también CIERREN al mismo tiempo. ¿Hay alguna manera de hacer que la terminación de un programa desencadene otro? Específicamente, si tengo CMus y GLava abiertos, me gustaría poder cerrar CMus (digamos, simplemente presionando 'q' y saliendo de CMus o cerrando la terminal, o eliminando el programa, O una combinación de teclas especial, etc. .) y hacer que GLava también se cierre/termine inmediatamente. Tal como están las cosas, tengo una combinación de teclas separada para pkill GLava después de cerrar CMus, lo que funciona bien, supongo, pero ciertamente es un poco más complicado de lo que me gustaría. Tal vez haya una manera de que GLava solo se active si CMus se está ejecutando, ¿tal vez una especie de lista blanca? ¿Un shell simple que cierra ambos programas que puedo vincular? ¿O tal vez otro pensamiento? Estoy abierto a cualquier sugerencia, siendo el novato que soy. Cualquier ayuda es muy apreciada.

Respuesta1

Una forma sencilla de permitir que los procesos se comuniquen esseñales.

bashTiene una llamada incorporada trapque le permite agregar un controlador para una señal determinada, por lo que puede envolver todos sus comandos dentro de otro script y configurar dicho controlador para que elimine todos los demás programas cuando reciba una señal determinada.

Considerar:

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

Ahora cree una envoltura para iniciar los otros dos procesos:

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

si inicia ./wrap.shy luego envía un SIGINT(PresioneCTRL-C) Puedes ver esto:

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

El inconveniente de esto es queEN CUALQUIER MOMENTOSi cierras un proceso, también se cerrará el otro, aparte del hecho de que a partir de ahora tendrás que eliminar el wrapproceso en lugar de uno.

Para evitar este inconveniente, puede iniciar el programa xfce desde un script insdie y configurar un controlador de señal directamente aquí, cuando uno de los dos reciba una señal de cierre, busque el pid del otro programa xfce-wrapper y elimínelo.

Respuesta2

Entonces, finalmente pude intentarlo y, como estoy seguro de que sabes, la idea y la ejecución del script son sólidas. Pero lamentablemente no es lo que estoy buscando. Lo que quiero exactamente es algo, probablemente un script, que active el cierre de un programa secundario específico cuando cierro el primer programa específico. Entonces, digamos que ya terminé de escuchar música en CMus. Me gustaría poder cerrar ese programa y hacer que eso active el cierre del programa secundario. Algo así como una tubería, pero para cerrar el programa. es posible?

información relacionada