Existe uma maneira de acionar o fechamento de um programa fechando outro? Um script de shell, talvez?

Existe uma maneira de acionar o fechamento de um programa fechando outro? Um script de shell, talvez?

Então, minha situação é a seguinte: criei um inicializador, atalhos de teclado e um alias que abre o GLava e o CMus em um terminal suspenso ao mesmo tempo, 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

É perfeito e glorioso, mas com um pequeno problema. Eu gostaria muito que ambos os programas também FECHAssem ao mesmo tempo. Existe uma maneira de fazer com que o encerramento de um programa acione outro? Especificamente, se eu tiver CMus e GLava abertos, gostaria de poder fechar o CMus (digamos, simplesmente pressionando 'q' e saindo do CMus ou fechando o terminal, ou encerrando o programa, OU uma ligação de tecla especial, etc. .) e faça com que o GLava feche/encerre imediatamente também. Do jeito que está, tenho uma ligação de chave separada para pkill GLava depois de fechar o CMus, o que funciona bem, suponho, mas certamente é um pouco mais desajeitado do que eu gostaria. Talvez haja uma maneira de o GLava só ser acionado se o CMus estiver em execução, talvez uma espécie de lista de permissões? Um shell simples que fecha os dois programas que posso vincular? Ou outro pensamento, talvez? Estou aberto a qualquer sugestão, sendo o noob que sou. Qualquer ajuda é muito apreciada.

Responder1

Uma maneira simples de permitir que os processos se comuniquem ésinais.

bashtenho uma chamada interna trapque permite adicionar um manipulador para um determinado sinal, para que você possa agrupar todos os seus comandos dentro de outro script e definir esse manipulador para matar todos os outros programas quando este receber um determinado sinal.

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

Agora crie um wrap para iniciar os outros dois processos:

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

se você lançar ./wrap.she depois enviar um SIGINT(pressioneCTRL-C) Você pode ver isso:

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

A desvantagem disso é queA QUALQUER MOMENTOvocê fecha um processo e o outro também será fechado, além do fato de que a partir de agora você precisa matar o wrapem vez de um de um processo.

Para evitar essa desvantagem, você pode iniciar o programa xfce a partir de um script insdie e definir um manipulador de sinal diretamente aqui, quando um dos dois receber um sinal de fechamento, procure o pid do outro programa xfce-wrapper e elimine-o.

Responder2

Então, finalmente consegui tentar e, como tenho certeza que você sabe, a ideia e a execução do roteiro são sólidas. Mas infelizmente não é o que procuro. O que eu quero exatamente é algo, provavelmente um script, que acione o fechamento de um programa secundário específico quando eu fechar o primeiro programa específico. Então, digamos que parei de ouvir música no CMus. Eu gostaria de poder encerrar esse programa e fazer com que o programa secundário também fosse encerrado. Mais ou menos como uma tubulação, mas para encerramento do programa. Isso é possível?

informação relacionada