¿Es posible activar un proceso que está en pausa usando el sleep
comando?
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 30m
lugar.
No desea llamar kill PID
ni presionar Ctrl+ C, ya que el último comando no se ejecuta y permanecerá cansado.
¿Hay alguna manera de activar el proceso sleep
o 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
gawk
ing realmente no funciona. La última vez que tuve unsleep
proceso,pushd
lo levanté de la cama.#!
línea. Y eso es importante porque la respuesta a su pregunta depende de si hay alguna-e
en 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-e
una respuesta bastante simple a su pregunta. Si-e
se 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 quepstree
podrí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 8506
y la sesión de Bash se reanudaría ... El problema está en un entorno programado, no conocemos el PID delsleep
comando 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 desleep
eso que se ejecutan debajo de ese PID. Esto es lo que pondría en el guión:Y luego podemos decirle
pkill
a lassleep
instancias nucleares que se ejecutan debajo de ese PID:Nuevamente, esto se limita a los
sleep
procesos 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 sleep
opkill sleep
, lo que podría destruir cualquiersleep
proceso 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, solosleep
se elimina.Un enfoque alternativo es
sleep
pasar 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
cron
el 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
pstree
su respuesta pero la rechazó porque mataría todas lassleep
instancias. Esto se puede evitar al restringir la búsqueda utilizando las opciones de pstree.Usando
pstree -h
vemos 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:
cron
inició un shell (ID de proceso 1308 e ID de sesión 1308)sleep
bajo ID de proceso 26552 y nuevamente ID de sesión 1308En este punto, podemos usar
pkill -s 1308
y mataría toda la sesión, que incluye el shell, nuestro programadisplay-auto-brightness
y elsleep
comando. En su lugar, usaremoskill 26552
solo 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