Alguém pode me mostrar como fazer um programa para fazer esta ação: após 5 minutos
echo "80" > /sys/class/leds/blue/brightness
Quero que este programa seja executado em segundo plano (como o serviço rngd
). Não posso fazer isso porque não sei muito sobre Linux.
Resposta
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Dessa forma, seu script continua ou você restaura o controle imediatamente, enquanto um novo tarefa em segundo plano do script é iniciada, com dois comandos: dormir e echo.
O erro comum é tentar fornecer sleep
ou echo
ou ambos &
que não funcionarão como pretendido. Lançar uma série de comandos em ()
embora os gere em um processo de shell separado, que você pode enviar todo para o fundo com &
.
Nesse sentido, onde o achei ativamente útil. Em um dispositivo embutido que desenvolvo, há o aplicativo principal que funciona com um watchdog. Se ele falhar de uma forma que acione a redefinição do watchdog logo após a inicialização, repetidamente, é difícil consertar remotamente como o período entre o início do SO e a reinicialização é muito curta, não o suficiente para fazer o ssh e bloquear a inicialização do aplicativo. Portanto, preciso encontrar uma maneira de determinar se o sistema foi reiniciado tão rápido e apresentar um atraso, se for o caso, para ter tempo de consertá-lo manualmente.
[ -f /tmp/startdelay ] && sleep 30 touch /tmp/startdelay ( sleep 30 ; rm /tmp/startdelay ) & [ -f /tmp/noautostart ] && exit 0 start_app
Se eu faça login e execute 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 o próximo vez que o sistema é iniciado, vou me dar 30 segundos extras para interrompê-lo. Caso contrário, o reinício será rápido, sem demora.
Comentários
Resposta
use o comando at
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
que será executado em segundo plano
Comentários
- Esta é a maneira certa de fazer isso , mas precisa do daemon atd em execução e na maioria dos sistemas precisará ter um pacote instalado.
- Você pode usar aspas simples para evitar o escape e renunciar
echo
completamente usando um heredoc ou herestring. - @Julian,
at
é um comando POSIX padrão. Qual sistema semelhante ao Unix não ' o tem disponível por padrão? - @St é phaneChazelas – boa pergunta . Eu sei que ' tive esse problema, mas foi há um tempo. Fiz uma pequena verificação e o comando at parece bastante onipresente. Além disso, parece que o atd é específico do Linux e até mesmo em alguns sistemas Linux pode ser substituído por um daemon cron no estilo BSD. Vamos ' s considerar meu comentário desatualizado.
- Tentei ' em ' e nenhum comando foi encontrado no Android 8
Resposta
Se você deseja que algo seja executado no 5 minutos, mas o resto do seu programa para continuar (ou terminar), você precisa colocar o sono em segundo plano também:
#!/bin/bash runWithDelay () { sleep $1; shift; "${@}"; } runWithDelay 3 echo world & echo hello
Isso imprimirá hello
e 3 segundos depois (após o programa principal ter sido encerrado), imprima world
.
A parte importante é o &
para bifurcar a execução da função em segundo plano.
Comentários
- Posso sugerir
runWithDelay () { sleep $1; "${@:2}"; }
em vez disso? - Acho que sim deve ler
doWhateverWithDelay 3 &
em seu segundo exemplo. - @manatwork: Cheers.
- @goldilocks, o essencial no uso de
$@
é que você pode citá-lo e será expandido como uma lista de palavras citadas. Portanto, é melhor torná-lo"$@"
(ou"${@}"
se você gostar das chaves).Veja pastebin.com/MU7hbB2C - @manatwork: Point taken;) Eu tentei isso usando args com echo (
-n
), mas obviamente isso foi um pouco ingênuo.
&
para colocar em segundo plano o sono; " você também precisa colocar o sono em segundo plano " estava na primeira linha desde o início. Se você não ' não acredita em mim, consulte o histórico de edições. E minha resposta é 5 minutos mais velha que a sua: P()
, o shell original fará uma pausa até que o que foi gerado termine.)