¿Es posible activar un proceso que está en pausa usando el sleepcomando?
Como ejemplo, supongamos que tiene este script:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Después de 30 minutos, descubre que necesita que el script se detenga, es decir, desea haber escrito en su sleep 30mlugar.
No desea llamar kill PIDni presionar Ctrl+ C, ya que el último comando no se ejecuta y permanecerá cansado.
¿Hay alguna manera de activar el proceso sleepo quizás usar otro comando que admita la activación? Las soluciones para los procesos en segundo plano y en primer plano son bienvenidas
command-line
bash
Bittenus
fuente
fuente

gawking realmente no funciona. La última vez que tuve unsleepproceso,pushdlo levanté de la cama.#!línea. Y eso es importante porque la respuesta a su pregunta depende de si hay alguna-een la#!línea.#!/bin/bash -e, el script se detendrá después de un error. Bash matará simplemente el comando de suspensión como un error. Eso significa que sin-euna respuesta bastante simple a su pregunta. Si-ese usó, entonces se vuelve mucho más difícil porque tendrías que detener el proceso de sueño sin matarlo.Respuestas:
Cuando se ejecuta un script Bash
sleep, esto es lo quepstreepodría parecer:Ambos tienen ID de proceso (PID), incluso cuando se ejecutan como un script. Si quisiéramos interrumpir el sueño, lo enviaríamos
kill 8506y la sesión de Bash se reanudaría ... El problema está en un entorno programado, no conocemos el PID delsleepcomando y no hay un humano para mirar el proceso árbol.Podemos obtener el PID de la sesión Bash a través de la
$$variable mágica. Si podemos almacenar eso en algún lugar, podemos dirigirnos a instancias desleepeso que se ejecutan debajo de ese PID. Esto es lo que pondría en el guión:Y luego podemos decirle
pkilla lassleepinstancias nucleares que se ejecutan debajo de ese PID:Nuevamente, esto se limita a los
sleepprocesos que se ejecutan directamente en esa única sesión Bash. Siempre que el PID se haya registrado correctamente, esto lo hace mucho más seguro quekillall sleepopkill sleep, lo que podría destruir cualquiersleepproceso en el sistema (si los permisos lo permiten).Podemos probar esa teoría con el siguiente ejemplo donde tenemos tres sesiones bash separadas, dos en ejecución
sleep. Solo porque estamos especificando el PID de la sesión bash superior izquierda, solosleepse elimina.Un enfoque alternativo es
sleeppasar al fondo, almacenar su PID y luego devolverlo al primer plano. En el guión:Y para matarlo:
fuente
Puede escribir su script para manejar ("atrapar") otras señales de kill, etc. para poder modificar el comportamiento de los scripts según sea necesario. Ver hombre bash:
fuente
Podrías matar el sueño que continuaría con la siguiente línea del script:
Tenga en cuenta que esto eliminaría cualquier proceso de suspensión que se ejecute en su sistema, no solo en su secuencia de comandos.
fuente
Tengo un script de bash para dormir iniciado en
cronel arranque. El guión se despierta cada minuto y establece el brillo de la pantalla de la computadora portátil en función del amanecer y el atardecer obtenidos de Internet. Una fase de transición configurable por el usuario entre brillo total y atenuación completa requiere aumentar y disminuir los valores en 3, 4, 5 o lo que se calcule cada minuto.Oli mencionó brevemente
pstreesu respuesta pero la rechazó porque mataría todas lassleepinstancias. Esto se puede evitar al restringir la búsqueda utilizando las opciones de pstree.Usando
pstree -hvemos toda la jerarquía:Como puede ver, un inicio de sesión típico de Ubuntu contiene muchos PID (ID de proceso).
Podemos reducirlo a nuestro script en ejecución usando:
Vemos:
croninició un shell (ID de proceso 1308 e ID de sesión 1308)sleepbajo ID de proceso 26552 y nuevamente ID de sesión 1308En este punto, podemos usar
pkill -s 1308y mataría toda la sesión, que incluye el shell, nuestro programadisplay-auto-brightnessy elsleepcomando. En su lugar, usaremoskill 26552solo para matar el comando de suspensión, lo que obligará a nuestro programa a despertarse y ajustar el brillo.Escribiendo esto manualmente en el terminal que ves:
El siguiente paso es hacerlo cuando la computadora portátil se despierte de la suspensión. Por ejemplo, cuando la tapa se cerró, estaba completamente oscura y el brillo de la pantalla se estableció en "300". Cuando se abre la tapa, es de día y el brillo debe establecerse en "2000". Por supuesto, el programa se activaría por sí solo en 1 a 59 segundos, pero es más cómodo configurar el brillo al instante.
Publicaré el código de suspensión / reanudación después de que esté escrito. Ojalá este fin de semana.
fuente