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
-
tkill
espera quesome_command
gere saída de texto (não binário). -
tkill
probesstdout
do 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_command
sair sozinho, seu status de saída será reutilizado como o status de saída detkill
;tkill 5 true
retorna0
;tkill 5 false
retorna1
;tkill 5 "true; false"
retorna1
. - Se o tempo limite determinado expirar ou
tkill
for interrompido porSIGINT
ouSIGTERM
, o status de saída será143
.
Fragmentos de código explicados
-
eval
torna os exemplos avançados possíveis. -
tee
nos permite analisarstdin
enquanto 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 .