¿Alguien puede mostrarme cómo hacer un programa para realizar esta acción: después de 5 minutos
echo "80" > /sys/class/leds/blue/brightness
Quiero que este programa se ejecute en segundo plano (como el servicio rngd
). No puedo hacer esto porque no sé mucho sobre Linux.
Responde
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
De esa forma tu secuencia de comandos continúa, o restauras el control inmediatamente, mientras un nuevo se inicia la tarea en segundo plano del script, con dos comandos: sleep y echo.
El error común es intentar dar sleep
o echo
o ambos &
que no funcionarán como se esperaba. Sin embargo, al ejecutar una serie de comandos en ()
, se generan en un proceso de shell separado, que luego puede enviar completo en segundo plano con &
.
En ese sentido, donde lo encontré activamente útil. En un dispositivo integrado que desarrollo, existe la aplicación principal que funciona con un perro guardián. Si falla de una manera que activa el reinicio del perro guardián poco después del inicio, repetidamente, es difícil de arreglar de forma remota ya que el período entre el inicio del sistema operativo y el restablecimiento es bastante corto, no lo suficiente como para ingresar y bloquear el inicio de la aplicación. Así que necesito una forma de determinar que el sistema se reinició tan rápido e introducir un retraso si lo hizo, para darme tiempo para solucionarlo manualmente.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Si inicie sesión y ejecute touch /tmp/noautostart
la aplicación principal no se iniciará. Si el perro guardián se activa, rm /tmp/startdelay
no se ejecutará y el siguiente Una vez que el sistema se inicia, me dará 30 segundos adicionales para detenerlo. De lo contrario, el reinicio será rápido, sin demora.
Comentarios
Responder
use el comando at
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
que se ejecutará en segundo plano
Comentarios
- Esta es la forma correcta de hacerlo , pero necesita el demonio atd en ejecución y en la mayoría de los sistemas necesitará tener un paquete instalado.
- Puede usar comillas simples para evitar el escape y renunciar a
echo
en conjunto usando un heredoc o herestring. - @Julian,
at
es un comando POSIX estándar. ¿Qué sistema similar a Unix no ' no lo tiene disponible por defecto? - @St é phaneChazelas – buena pregunta . Sé que ' he tenido este problema, pero fue hace un tiempo. Hice una pequeña comprobación y el comando at parece bastante ubicuo. También parece que atd es específico de Linux e incluso en algunos sistemas Linux puede ser reemplazado por un demonio cron estilo BSD. Dejemos que ' s consideren que mi comentario está desactualizado.
- Probé ' en ' y no se encontró ningún comando en Android 8
Responda
Si desea que algo se ejecute en 5 minutos, pero el resto de su programa para continuar (o finalizar), también necesita poner en segundo plano el sueño:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Esto imprimirá hello
y luego 3 segundos más tarde (después de que el programa principal haya salido), imprima world
.
La parte importante es la &
para bifurcar la ejecución de la función en segundo plano.
Comentarios
- ¿Puedo sugerir
runWithDelay () { sleep $1; "${@:2}"; }
en su lugar? - Creo que debe leer
doWhateverWithDelay 3 &
en su segundo ejemplo. - @manatwork: Saludos.
- @goldilocks, lo esencial en el uso de
$@
es que puede citarlo y se ampliará como una lista de palabras citadas. Así que mejor hazlo"$@"
(o"${@}"
si te gustan las llaves).Ver pastebin.com/MU7hbB2C - @manatwork: Punto tomado;) Lo intenté usando args con echo (
-n
), pero obviamente eso fue un poco ingenuo.
&
para poner en segundo plano el sueño; " también necesitas poner en segundo plano el sueño " estaba en la primera línea desde el principio. Si no ' no me cree, mire el historial de ediciones. Y mi respuesta es 5 minutos más antigua que la suya: P()
, el shell original se detendrá hasta que termine el generado).