El código
Guarde esto como tkill(hágalo ejecutable y ajuste su PATHsi 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 ( 30aquí) es el tiempo de espera en segundos.
Notas
tkillespera some_commandgenerar salida de texto (no binario).
tkillsondas stdoutdel comando dado. Para incluir stderrredirigirlo 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_commandsale solo, su estado de salida se reutilizará como el estado de salida de tkill; tkill 5 truevuelve 0; tkill 5 falsevuelve 1; tkill 5 "true; false"vuelve 1.
- Si el tiempo de espera expirado o
tkilles interrumpido por SIGINTo SIGTERMentonces el estado de salida será 143.
Fragmentos de código explicados
eval hace posibles los ejemplos avanzados.
teenos permite analizar stdinmientras 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 .