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


33

¿Alguien puede mostrarme cómo hacer un programa para hacer 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 rngdservicio). No puedo hacer esto porque no sé mucho sobre Linux.

Respuestas:


51
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &

De esa manera, su secuencia de comandos continúa o restaura el control de inmediato, mientras se inicia una nueva tarea en segundo plano de la secuencia de comandos, con dos comandos: suspensión y eco.

El error común es tratar de dar, ya sea sleepo echobien conjuntamente la &que no funcionará como se pretende. Lanzar una serie de comandos en ()aunque los genera en un proceso de shell separado, que luego puede enviar todo en segundo plano &.


A ese ingenio, donde lo encontré activamente útil. En un dispositivo integrado que desarrollo, está la aplicación principal que funciona con un perro guardián. Si falla de una manera que activa el reinicio de watchdog poco después del inicio, en varias ocasiones, es difícil de solucionar de forma remota ya que el período entre el inicio del sistema operativo y el reinicio es bastante corto, no es suficiente para ingresar y bloquear el inicio de la aplicación. Por lo tanto, necesito una forma de determinar si 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 inicio sesión y realizo touch /tmp/noautostartla aplicación principal, no se iniciará. Si el watchdog se activa, rm /tmp/startdelayno se realizará y la próxima vez que se inicie el sistema, me dará 30 segundos adicionales para detenerlo. De lo contrario, el reinicio será rápido, sin demora.


Sí, estoy de acuerdo, pero eso también puede ser parte de la reflexión del usuario ;-)
Kiwy

Otras respuestas parecen perder la parte "en segundo plano". No, fui bastante explícito al respecto: /
Ricitos de Oro

@goldilocks: Agregaste el envío a la parte de fondo solo después de que publiqué mi respuesta.
SF.

No, mi respuesta original fue ejecutar una función que contenga dormir con el &fondo del sueño; "también necesitas dormir en segundo plano" estaba en la primera línea desde el principio. Si no me crees, mira el historial de edición. Y mi respuesta es 5 minutos mayor que la tuya: P
Ricitos de Oro

1
@gekannt: ... uh, la pregunta es "¿Cómo ejecutar un comando en segundo plano con un retraso?" - ¿Cómo lo lograrías de otra manera? (y no, si no haces un fondo del ()grupo, el shell original se detendrá hasta que el generado termine).
SF.

11

usa el atcomando

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

que se ejecutará en segundo plano


2
Esta es la forma correcta de hacerlo, pero necesita el atd daemon ejecutándose y en la mayoría de los sistemas necesitará tener un paquete instalado.
Julian

Puede usar comillas simples para evitar el escape y renunciar echopor completo mediante el uso de un heredoc o herejía.
Chris Down

@Julian, ates un comando POSIX estándar. ¿Qué sistema tipo Unix no lo tiene disponible por defecto?
Stéphane Chazelas

1
@ StéphaneChazelas - buena pregunta. Sé que he tenido este problema, pero fue hace un tiempo. Revisé un poco y el comando at parece bastante omnipresente. También parece que atd es específico de Linux e incluso en algunos sistemas Linux puede ser reemplazado por un demonio cron de estilo BSD. Consideremos mi comentario desactualizado.
Julian

Intenté 'at' y no se encontró ningún comando en Android 8
beppe9000

6

Si desea que algo se ejecute en 5 minutos, pero el resto de su programa continúe (o termine), también necesita poner en segundo plano el sueño:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

Esto imprimirá helloy luego 3 segundos después (después de que el programa principal haya salido), imprima world.

La parte importante es la &bifurcación de la ejecución de la función en segundo plano.


1
¿Puedo sugerir en su runWithDelay () { sleep $1; "${@:2}"; }lugar?
trabajo de

1
Creo que debería leer doWhateverWithDelay 3 &en su segundo ejemplo.
Baarn

@manatwork: Saludos.
Ricitos de Oro

1
@goldilocks, lo esencial en el uso $@es que puede citarlo y se expandirá como una lista de palabras citadas. Así que mejor hazlo "$@"(o "${@}"si te gustan los frenillos). Ver pastebin.com/MU7hbB2C
manatwork

@manatwork: Punto tomado;) Intenté eso usando args con echo ( -n), pero obviamente eso fue un poco ingenuo.
Ricitos de oro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.