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 COMMANDy 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 porquepaplaymaneja 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
trappara atrapar ctrl- c(oSIGTERM), elimina el comando (lo he usadosleepaquí como prueba) y sale.fuente
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; donetrapacercamiento 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á elwhileciclo. Tal vez hay una mejor manera.fuente
paplayen 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+dentonces el trabajo en segundo plano no se cerrará, y luego puede eliminar el trabajo desde cualquier lugar utilizandokill PIDSi pierde el rastro de su PID, puede usarlo
pstree -pa $USERopgrep -fl '.*PROCESS.*'ayudarlo a encontrarlofuente
Uso
trap-fuente