Pergunta

Eu quero escrever um script shell que gera vários processos de longa execução em segundo plano, em seguida, trava ao redor. Ao receber SIGTERM, quero que todos os subprocessos para terminar bem.

Basicamente, eu quero um "processo mestre".

Aqui está o que eu tenho até agora:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

# supposedly this should kill the child processes on SIGTERM. 
trap "kill $PID1 $PID2" SIGTERM 

wait

O script acima falha com trap: 10: SIGTERM: bad trap.

Edit: eu estou usando o Ubuntu 9.04

Foi útil?

Solução 2

resposta de Joe me colocou no caminho certo. Eu também descobri que deve prender mais sinais para cobrir minhas bases.

script procura finais como esta:

#!/bin/sh

sleep 600 &
PID1="$!"

sleep 600 &
PID2="$!"

trap "kill $PID1 $PID2" exit INT TERM

wait

Outras dicas

Isso funciona para mim:

trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
  • kill -- -$$ envia um SIGTERM para todo o grupo de processos , matando assim também descendentes.

  • Especificando EXIT sinal é útil quando se usa set -e (mais detalhes aqui ).

Eu suspeito que o seu bin / / sh não é um Bash (embora você marcou a questão como 'Bash').

A partir da mensagem que eu acho que é um traço. Verifique seu manual ou apenas corrigir o seu shebang se você precisa escrever código Bash.

Este script parece correto e funciona para mim como esperado.

Como você enviar o sinal SIGTERM para o "processo de mestre"? Talvez você deve executar kill -l para verificar quais os sinais são suportados. Como a mensagem de erro sugere que você enviar o sinal de "10", que o seu sistema não parecem reconhecer.

E da próxima vez que você deve adicionar o sistema operacional, a versão do shell, kernel, ... para tal pergunta

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top