¿Cómo ejecutar un comando en segundo plano con retraso?

¿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

  • Sí, estoy de acuerdo, pero eso también puede ser parte de la reflexión del usuario; -)
  • Otras respuestas parecen perder la " en la parte " de fondo. No, yo fue bastante explícito al respecto: /
  • @goldilocks: agregaste el envío en la parte de fondo solo después de que publiqué mi respuesta.
  • No, mi respuesta original fue ejecutar una función que contenga sleep con & 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
  • @gekannt: … uh, la pregunta es " Cómo ejecutar un comando en el fondo con un retraso? " – ¿cómo lo lograrías de otra manera? (y no, si no ' t fondo el grupo (), el shell original se detendrá hasta que termine el generado).

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *