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.
bash
Tiene una llamada incorporada trap
que 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.sh
y 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 wrap
proceso 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?