Programar convenientemente um comando para ser executado mais tarde?

87

O que é uma maneira simples de executar um comando, digamos, daqui a oito horas? Eu posso pensar assim:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Existe uma maneira mais "adequada"?

Steve Bennett
fonte
Há algo de errado com o nohup+ sleep? Por que é "impróprio"?
Cprn

Respostas:

123

Você pode usar o atcomando Os atcomandos de execução posteriormente. O atutilitário deve ler os comandos da entrada padrão e agrupá-los como um trabalho, para serem executados posteriormente.

Normalmente, até instalado por padrão no Ubuntu, mas se o seu lançamento não o incluir, instale via:

sudo apt-get install at

Para mais informações, opções, exemplos e outros, consulte o repositório de páginas Manuais do Ubuntu.

Exemplo:

at now +8 hours -f ~/myscript.sh

Você também pode usar atalhos convenientes, como tomorrowou noon, como em

echo "tweet fore" | at teatime 

Aviso: Isso executará o comando à esquerda do tubo imediatamente, mas somente apresentará sua saída posteriormente. O exemplo também demonstra como você pode canalizar açõesat. at -cé a maneira de examinar as ações agendadas, que você pode listar convenientemente com o número delas, como em:

at -c 3
Mitch
fonte
19
Pode ser útil para adicionar um exemplo de uso simples, que aborda a questão do autor original, mais especificamente, por exemploat now +8 hours -f ~/myscript.sh
steeldriver
6
Além disso, existe at 8:00para executar o comando em um tempo absoluto, e batchpara "quando parece que o computador está ocioso"
Simon Richter
4
Caso alguém esteja se perguntando, teatimeé às 16h. Por algumas razões, não é mencionado em manpages.ubuntu.com/manpages/raring/man1/at.1posix.html, mas está man ataqui e aqui em manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan
3
Talvez possamos mencionar que o utilitário "at" não está instalado por padrão e se alguém quiser obtê-lo, basta instalar o pacote "at"? Edit: Enfim, eu simplesmente editei a resposta (também corrigi o link da página de manual).
heartsmagic
4
Cuidado com o fato de que a canalização em at executará o comando imediatamente e somente agendará a saída. Eu tive uma falha de impressão 3D de 4 horas porque queria agendar, gpio write 8 1mas ele foi executado imediatamente.
Maciej Swic 28/02
8

Sim, você pode definir um trabalho cron.

Por exemplo, se agora é 14:39:00 e hoje é sexta-feira, 30 de agosto, você pode adicionar o seguinte trabalho cron (a ser executado após 8 horas) no seu arquivo crontab usando o crontab -ecomando:

39 22 30 8 5  /path/to/mycommand.sh

Mais sobre:

Radu Rădeanu
fonte
3
Ok, sim, eu deveria ter mencionado que eu sei sobre empregos de Cron. Isso é ainda mais confuso, porque fica indefinidamente no crontab, certo?
Steve Bennett
4
@ RaduRădeanu: com cron, cuidado para que ele pudesse atirar novamente em alguns anos (quando não há outro 30 de agosto ocorrendo em uma sexta-feira) ...
Olivier Dulac
2
Este é um truque inteligente. No entanto, 'at' é uma maneira muito melhor. O que aconteceria se o computador fosse desligado às 14:39?
Emory
1
Err ainda não é o meu ponto. O que quero dizer é que o texto que você digitou ainda estará (literalmente) no seu crontab após o evento, criando outra tarefa de limpeza para você.
Steve Bennett
2
@SteveBennett Sim, você está correto. O comando permanecerá no seu crontabaté que você o remova. Um ano depois, quando você esquecer quem colocou lá e por quê, ficará coçando a cabeça, imaginando o que fazer com o comando.
Paddy Landau
8

Utilizar a GUI baseada em Gnome para cron, ate afins:

A introdução do CronHowto sugere o uso da gnome-scheduleGUI, que é muito mais agradável do que digitar todo o lixo no terminal (especialmente para usuários "médios" do Ubuntu que não são usuários "avançados" * nix / bsd).

Execute-o usando o Unity Dash (ou outro menu de aplicativos) para procurar tarefas agendadas ou em execução gnome-schedule.

Nos sistemas Ubuntu baseados no Gnome, a ferramenta Tarefas agendadas do Gnome (do pacote gnome-schedule) em Aplicativos -> Ferramentas do sistema fornece uma interface gráfica com instruções para usar o Cron. O site do projeto está em http://gnome-schedule.sourceforge.net/ ; o software é instalável no Centro de Software ou digitando

sudo apt-get install gnome-schedule

em um terminal.

Usando gnome-schedule, para um script em seu diretório pessoal, um novo comando "at" seria configurado usando este tipo de janela:

insira a descrição da imagem aqui

user29020
fonte
5

Eu descobri uma maneira rápida e suja de fazer isso antes de descobrir que atera uma coisa.

Digamos que você queira que seu script seja executado ao meio-dia:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Digamos que você queira que ele funcione amanhã ao meio-dia (hoje é 24 de novembro para mim):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Atualização : Método ligeiramente melhor: teste apenas os números de que você gosta, usando date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
wjandrea
fonte
10
Para as duas pessoas que já upvoted esta resposta, por favor use at, cronou qualquer outra aplicação real programador. O agendamento de tarefas é difícil e não é uma roda que você deve reinventar.
precisa saber é o seguinte
1
@ dimo414 O que há de errado com meu método?
wjandrea
8
No mínimo, é uma espera ocupada, o que é um desperdício. Pior, não é garantido que esteja correto; é perfeitamente possível (se improvável) que o condicional seja perdido. Basear seu planejador em expressões regulares também é altamente propenso a erros. Pode funcionar bem o suficiente , mas não possui vantagens at.
precisa saber é o seguinte
(Aparte: Eu não downvote sua resposta, eu só não acho que as pessoas devem usá-lo)
dimo414
4
Outro motivo para usar até porque seus trabalhos sobreviverão a uma reinicialização.
28817 manatwork