O código
Salve isso como tkill (torne-o executável e ajuste seu PATH se necessário):
#!/bin/bash
_terminate_children() {
trap "exit 143" SIGTERM && kill -- -$$
}
trap _terminate_children SIGINT SIGTERM
tout="$1"
shift
eval $@ | tee >(while :; do
read -t "$tout"
case $? in
0) : ;;
1) break ;;
*) _terminate_children ;;
esac
done)
exit ${PIPESTATUS[0]}
Uso básico
tkill 30 some_command
O primeiro argumento ( 30 aqui) é o tempo limite em segundos.
Notas
-
tkillespera quesome_commandgere saída de texto (não binário). -
tkillprobesstdoutdo comando fornecido. Para incluirstderr, redirecione-o como no último exemplo avançado abaixo.
Uso avançado
Estes são exemplos válidos:
tkill 9 foo -option value
tkill 9 "foo -option value" # equivalent to the above
tkill 5 "foo | bar"
tkill 5 'foo | bar'
tkill 5 'foo | bar | baz' # tkill monitors baz
tkill 5 'foo | bar' | baz # baz reads from tkill
tkill 3 "foo; bar"
tkill 6 "foo && bar || baz"
tkill 7 "some_command 2>&1"
Use a sintaxe Bash nessas citações.
Sair do status
- Se
some_commandsair sozinho, seu status de saída será reutilizado como o status de saída detkill;tkill 5 trueretorna0;tkill 5 falseretorna1;tkill 5 "true; false"retorna1. - Se o tempo limite determinado expirar ou
tkillfor interrompido porSIGINTouSIGTERM, o status de saída será143.
Fragmentos de código explicados
-
evaltorna os exemplos avançados possíveis. -
teenos permite analisarstdinenquanto ainda passamos uma cópia parastdout. -
read -té responsável por aplicar o tempo limite, seu status de saída é usado para determinar o que fazer a seguir. - Comandos monitorados são eliminados quando necessário com esta solução .
- O status de saída dos comandos monitorados é recuperado com esta solução .