Respostas:
( 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: suspensão e eco.
O erro comum é tentar dar tanto sleep
ou echo
ou ambos o &
que não vai funcionar como pretendido. O lançamento de uma série de comandos os ()
gera em um processo de shell separado, com o qual você pode enviar todo em segundo plano &
.
Nesse sentido, onde eu o achei ativamente útil. Em um dispositivo incorporado que desenvolvo, há o aplicativo principal que funciona com um cão de guarda. Se ele falhar de uma maneira que acione a redefinição do watchdog logo após a inicialização, repetidamente, é difícil corrigir remotamente, pois o período entre o início do sistema operacional e a redefinição é bastante curto, não é suficiente para sincronizar e bloquear 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 houver, 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 efetuar login e executar touch /tmp/noautostart
o aplicativo principal, não será iniciado. Se o cão de guarda rm /tmp/startdelay
entrar em ação, não será executado e na próxima vez que o sistema for iniciado, me dará 30s extras para pará-lo. Caso contrário, o reinício será rápido, sem demora.
&
fundo para dormir; "você também precisa dormir em segundo plano" estava na primeira linha desde o início. Se você não acredita em mim, veja o histórico de edições. E minha resposta é de 5 minutos mais velho do que sua: P
()
grupo, o shell original será pausado até que o desovado termine.)
use o at
comando
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
que será executado em segundo plano
echo
completamente usando um heredoc ou herestring.
at
é um comando POSIX padrão. Qual sistema Unix-like não o tem disponível por padrão?
Se você deseja que algo seja executado em 5 minutos, mas o restante do seu programa continue (ou termine), você também precisará adormecer:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Isso será impresso hello
e, em seguida, 3 segundos depois (após a saída do programa principal), imprima world
.
A parte importante é &
colocar a execução da função em segundo plano.
runWithDelay () { sleep $1; "${@:2}"; }
vez disso , posso sugerir ?
doWhateverWithDelay 3 &
no seu segundo exemplo.
$@
é que você pode citá-lo e será expandido como uma lista de palavras citadas. Então é melhor fazê-lo "$@"
(ou "${@}"
se você gosta do aparelho). Veja pastebin.com/MU7hbB2C
-n
), mas obviamente isso foi um pouco ingênuo.