Como executar um comando em segundo plano com atraso?

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

  • Sim, eu concordo, mas isso também pode fazer parte da reflexão do usuário; -)
  • Outras respostas parecem perder a parte " no fundo ". Não, eu foi bem explícito sobre isso: /
  • @goldilocks: Você adicionou a parte de envio para segundo plano somente depois que eu postei minha resposta.
  • Não, minha resposta original era executar uma função contendo sono com & 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
  • @gekannt: … uh, a questão é " Como executar um comando em o plano de fundo com um atraso? " – como você faria isso de outra forma? (e não, se você não ' colocar em segundo plano o grupo (), o shell original fará uma pausa até que o que foi gerado termine.)

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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *