O script Bash deve matar apenas as instâncias de outro script que ele lançou

11

Na situação atual, um determinado script 'chamando.sh' inicia outro script 'chamado.sh' em segundo plano, executa outras operações, dorme por um tempo e depois encerra 'chamado.sh' com a pkill called.sh. Isso funciona bem.

Em seguida, também gostaria de iniciar o 'named.sh' de outros terminais como um script independente a qualquer outro momento, antes ou depois do lançamento do calls.sh. Essas instâncias independentes não devem ser eliminadas pelo 'chamando.sh'.

Como posso conseguir isso? A intuição diz que o script de chamada deve poder informar o processo iniciado a partir de outros nomes que estão sendo executados nesse meio tempo.

Como uma variante, 'Calling.sh' também pode iniciar 'Called', que é um link simbólico para 'Called.sh'. Isso complica o gerenciamento da situação acima? Quais cuidados e ajustes específicos são necessários para o uso de um link simbólico?

XavierStuvw
fonte
1
Acredito que o cancelamento de
Rusi

Respostas:

27

Não use o nome para matá-lo. Como o calling.shscript está chamando o processo que você deseja matar mais tarde, basta usar $!(from man bash):

! Se expande para o ID do processo do trabalho, mais recentemente, colocado no fundo, seja executado como um comando assíncrono ou usando o bgbuiltin

Então, se você calling.shé assim:

called.sh &
## do stuff
pkill called.sh

Altere para este:

called.sh &
calledPid=$!
# do stuff
kill "$calledPid"
terdon
fonte
4
Isso deve funcionar desde que chamado.sh não morra sozinho, porque, caso contrário, seu pid poderá ser reutilizado, matando um processo inocente e não relacionado como resultado.
Eugene Ryabtsev 12/03/19
2
@EugeneRyabtsev é um ponto muito bom. Eu acho que você também pode verificar se o $calledPidPID pai é o PID de called.sh.
terdon
Para reforçar a resposta, este é um outro recurso que eu encontrei útil para organizar meus pensamentos: mywiki.wooledge.org/ProcessManagement
XavierStuvw
18

Eu tive que escolher isso, mas fora dos scripts, muitas vezes; é ainda mais divertido quando os scripts são chamados como parte de um agendamento automatizado complexo. Você realmente não deve confiar em algo como pkillselecionar qual script matar.

Dentro de Call.sh, você deve registrar os PIDs dos trabalhos que você iniciou e matá-los explicitamente pelo PID.

Por dentro call.sh:

./called.sh &
called_pid=$!

# Later
kill $called_pid
Philip Couling
fonte