Eliminar subprocessos depois que o script for concluído ou eliminado

Eliminar subprocessos depois que o script for concluído ou eliminado

Digamos que eu tenha um script como o seguinte

#!/usr/bin/env zsh
./subscript.sh &
# do stuff
...
# do more stuff

Gostaria que o processo em execução subscript.sh(e quaisquer processos iniciados por ele) fosse totalmente encerrado sempre que:

  1. O script acima sai
  2. O script acima foi eliminado por qualquer motivo.

Como posso aplicar o que foi dito acima? Isso é resolvido automaticamente pelo shell?

Responder1

O shell definitivamente não matará espontaneamente seus subprocessos - afinal, um trabalho em segundo plano deve ser executado em segundo plano e não se importar com a vida de seu pai. (Um shell interativo, em algumas circunstâncias, matará seus subprocessos ao sair - o que nem sempre é desejável, portantonohup.)

Você pode fazer com que o script de shell elimine seus trabalhos em segundo plano quando ele sair ou for eliminado por um sinal capturável. Registre os IDs de processo dos trabalhos e elimine-os de uma armadilha. Observe que isso apenas elimina os trabalhos (como o processo original iniciado em segundo plano), não seus subprocessos.

jobs=()
trap '((#jobs == 0)) || kill $jobs' EXIT HUP TERM INT
subscript1 & jobs+=($!)
subscript2 & jobs+=($!)

Se você quiser ter certeza de eliminar todos os processos e seus subprocessos, é necessário mais planejamento. Um método é fazer com que todos os processos tenham um arquivo exclusivo aberto. Para eliminar todos eles, elimine todos os processos que possuem este arquivo aberto. Um subprocesso pode escapar fechando o arquivo.

#!/bin/sh
lock_file=$(mktemp)
exec 3<"$lock_file"
your_script
status=$?
exec 3<&-
fuser -k "$lock_file"
exit $status

Responder2

Você poderia capturar EXIT e enviar um sinal para o grupo de processos do script.

no Linux

trap 'kill -SIGTERM 0' EXIT

no FreeBSD

trap 'kill -15 -$$' EXIT

SIGKILLé o único sinal de que isso não funcionaria, já que o script foi eliminado incondicionalmente.

informação relacionada