Tengo un comando que deseo ejecutar automáticamente cada vez que finaliza, así que ejecuté algo como esto:
while [ 1 ]; do COMMAND; done;
pero si no puedo detener el ciclo Ctrl-cya que eso simplemente mata COMMAND
y no todo el ciclo.
¿Cómo lograría algo similar pero que pueda detener sin tener que cerrar el terminal?
Respuestas:
Verifique el estado de salida del comando. Si el comando fue terminado por una señal, el código de salida será 128 + el número de señal. De la documentación en línea de GNU para bash :
POSIX también especifica que el valor de un comando que terminó con una señal es mayor que 128, pero no parece especificar su valor exacto como lo hace GNU:
Por ejemplo, si interrumpe un comando con control-C, el código de salida será 130, porque SIGINT es la señal 2 en los sistemas Unix. Entonces:
fuente
paplay alert.ogg
, ¿quizás porquepaplay
maneja la señal?Puede detener y poner su trabajo en segundo plano mientras se ejecuta con ctrl+ z. Entonces puedes matar tu trabajo con:
Donde [1] es su número de trabajo.
fuente
Diría que sería mejor poner su bucle infinito en un script y manejar las señales allí. Aquí hay un punto de partida básico . Estoy seguro de que querrás modificarlo para adaptarlo. El script usa
trap
para atrapar ctrl- c(oSIGTERM
), elimina el comando (lo he usadosleep
aquí como prueba) y sale.fuente
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
acercamiento a la misma secuencia de comandos (bash) con el bucle infinito de ser muertos, su uso$$
en lugar de$!
(ver aquí )Generalmente solo me mantengo presionado Ctrl-C. Tarde o temprano se registrará entre
COMMAND
's' y así terminará elwhile
ciclo. Tal vez hay una mejor manera.fuente
paplay
en un archivo 1s.Si ejecuta bash con
-e
él, saldrá en cualquier condición de error:fuente
¿Por qué no simplemente?
O cuando se usa en un script,
fuente
Prefiero otra solución:
Para matar el ciclo, solo haz:
fuente
while :
creará un bucle infinito y te ahorrará escribiendo el[ 1 ]
Esto imprimirá el PID. Si sale de su solicitud utilizando,
ctrl+d
entonces el trabajo en segundo plano no se cerrará, y luego puede eliminar el trabajo desde cualquier lugar utilizandokill PID
Si pierde el rastro de su PID, puede usarlo
pstree -pa $USER
opgrep -fl '.*PROCESS.*'
ayudarlo a encontrarlofuente
Uso
trap
-fuente