Dado este bucle:
while sleep 10s ; do
something-that-runs-forever
done
Cuando presiono Ctrl + C, todo el ciclo while se interrumpe. Lo que quiero hacer es interrumpir el proceso "algo", dejar pasar 10 segundos y luego reiniciar "algo".
¿Cómo hago que ctrl + c solo afecte "algo" y no el ciclo while?
EDITAR: "interrumpir" como en SIGINT. Matar. Abortar. Terminar. No "interrumpir" como en "pausa".
fg
? ¿Por qué usar Ctrl + C?What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something"
. Si presiona Ctrl + Z, espere 10 segundos y luego ejecutefg
, eso es exactamente lo que sucederá. ¿Quizás podría editar su pregunta y dar un ejemplo específico para que podamos entender mejor?Respuestas:
Debería funcionar si solo haces
trap
SIGINT
algo. Me gusta:
(true
).Interrumpir
something...
no hace que el shell salga ahora, ya que ignora la señal. Sin embargo, si usted ^ C elsleep
proceso, saldrá con una falla, y el ciclo se detiene debido a eso. Mueva elsleep
al interior del bucle o agregue algo como|| true
para evitar eso.Tenga en cuenta que si
trap "" INT
ignora la señal por completo (en lugar de asignarle un comando), también se ignora en el proceso secundario, por lo que tampoco puede interrumpirlasomething...
. Esto se menciona explícitamente en al menos el manual de Bash :fuente
do (trap - INT; something-that-runs-forever)
permitir la interrupción del comando. Además, no es necesario que ejecute:
- sólo se puede utilizar una cadena vacía para ignorar una señal:trap '' INT
. Todo esto es POSIX, y debería funcionar en cualquier shell compatible (no solo Bash).SIGINT
en su totalidad no es estrictamente portátil: " Las implementaciones pueden permitir nombres con elSIG
prefijo o ignorar caso de nombres de señal como una extensión . (El subrayado es mío)"trap "" INT
(también posix)trap :
lugar de esotrap ""
fue exactamente eso, para que no se ignore la señal (sino que se convierta en un no-op), de modo que no necesitemos hacer nada más para poder interrumpir elsomething
programa principal .Otra opción es hacer que
something-that-runs-forever
maneje la señal (que sale con gracia cuando se recibe). Por supuesto, solo tiene sentido hacerlo cuando este programa se usa en muchos scripts, y el comportamiento deseado en CTRL+ Ces sistemáticamente el mismo: continuar la ejecución del script.fuente