El código
Guarde esto como tkill
(hágalo ejecutable y ajuste su PATH
si es necesario):
#!/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
El primer argumento ( 30
aquí) es el tiempo de espera en segundos.
Notas
tkill
espera some_command
generar salida de texto (no binario).
tkill
sondas stdout
del comando dado. Para incluir stderr
redirigirlo como en el último ejemplo avanzado a continuación.
Uso avanzado
Estos son ejemplos 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 la sintaxis de Bash en estas citas.
Estado de salida
- Si
some_command
sale solo, su estado de salida se reutilizará como el estado de salida de tkill
; tkill 5 true
vuelve 0
; tkill 5 false
vuelve 1
; tkill 5 "true; false"
vuelve 1
.
- Si el tiempo de espera expirado o
tkill
es interrumpido por SIGINT
o SIGTERM
entonces el estado de salida será 143
.
Fragmentos de código explicados
eval
hace posibles los ejemplos avanzados.
tee
nos permite analizar stdin
mientras le pasamos una copia stdout
.
read -t
es responsable de aplicar el tiempo de espera, su estado de salida se utiliza para determinar qué hacer a continuación.
- Los comandos que se supervisan se eliminan cuando es necesario con esta solución .
- El estado de salida de los comandos monitoreados se recupera con esta solución .