Como executar um comando em segundo plano com um atraso?

29

Alguém pode me mostrar como fazer um programa para fazer essa ação: depois de 5 minutos

echo "80" > /sys/class/leds/blue/brightness

Eu quero que este programa seja executado em segundo plano (como rngd service) Eu não posso fazer isso porque não sei muito sobre o Linux.

    
por user53337 28.11.2013 / 15:36

3 respostas

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

Dessa forma, seu script continua, ou você restaura o controle imediatamente, enquanto uma nova tarefa em segundo plano do script é iniciada, com dois comandos: sleep e echo.

O erro comum é tentar dar sleep ou echo ou ambos os & , que não funcionarão como pretendido. Lançando uma série de comandos em () , mas os gera em um processo de shell separado, que você pode enviar todo em background com & .

Para essa inteligência, onde eu achei ativamente útil. Em um dispositivo embarcado desenvolvo o principal aplicativo que funciona com um watchdog. Se falhar de uma forma que desencadeia a reinicialização do watchdog logo após a inicialização, é difícil corrigir remotamente, pois o período entre o início do SO e a reinicialização é bastante curto, não o suficiente para o ssh, e bloqueia a inicialização do aplicativo. Então, eu preciso de uma maneira de determinar o sistema reiniciado tão rápido e introduzir um atraso, se isso acontecer, para me dar tempo para corrigi-lo manualmente.

 [ -f /tmp/startdelay ] && sleep 30
 touch /tmp/startdelay
 ( sleep 30 ; rm /tmp/startdelay ) &
 [ -f /tmp/noautostart ] && exit 0
 start_app

Se eu fizer login e executar touch /tmp/noautostart , o aplicativo principal não será iniciado. Se o watchdog entrar em ação, rm /tmp/startdelay não será executado e na próxima vez que o sistema iniciar, ele me dará 30 segundos extras para pará-lo. Caso contrário, o reinício será rápido, sem demora.

    
por 28.11.2013 / 15:57
10

use o comando at

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

que será executado em segundo plano

    
por 28.11.2013 / 18:03
5

Se você deseja que algo seja executado em cinco minutos, mas o restante do programa continue (ou termine), também é necessário que você adormeça:

#!/bin/bash

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

runWithDelay 3 echo world &
echo hello    

Isto imprimirá hello e depois 3 segundos depois (depois que o programa principal sair), imprima world .

A parte importante é o & para bifurcar a execução da função em segundo plano.

    
por 28.11.2013 / 15:52

Tags