Eu sou um iniciante em Linux. Estou tentando aprender a usar at
para poder agendar tarefas para começar mais tarde, sem usar sleep
. Eu estive olhando para esta pergunta anterior para obter ajuda.
Minha pergunta é, no seguinte exemplo de script do bash que eu criei, por que "Running" nunca - até onde eu sei - é impresso na saída padrão (ou seja, no meu console do bash)?
#!/bin/bash
echo "Started"
at now + 1 minutes <<EOF
echo "Running"
EOF
echo "Finished"
A única saída que vejo é, por exemplo:
Started warning: commands will be executed using /bin/sh job 3 at Fri Jul 12 17:31:00 2013 Finished
A resposta à minha pergunta foi encontrada no aviso? Em caso afirmativo, como /bin/sh
difere da saída padrão?
sleep 3m; echo Running
Respostas:
Porque
at
não executa comandos no contexto da sua sessão de usuário conectado. A idéia é que você pode agendar um comando para execução em um horário arbitrário e, em seguida, efetue logout e o sistema cuidará da execução do comando no horário especificado.Observe que a página de manual para
at(1)
especificamente diz (minha ênfase):Portanto, você deve verificar o spool de correio local ou, na sua falta, os logs de correio do sistema local. / var / spool / mail / $ USER é provavelmente um bom lugar para começar.
Observe também que o "Iniciado" e "Concluído" se originam do script externo e, por si só, não têm nada a ver
at
. Você pode retirá-los ouat
invocar e obterá basicamente o mesmo resultado.fonte
Como o @ MichaelKjörling explicou, qualquer saída produzida pelo seu
at
trabalho será capturada e enviada a você por e-mail. Se você não possui um MTA - Mail Transfer Agent em sua caixa, o e-mail pode estar no limbo e você nem saberá queat
está tentando fazer isso.Um MTA é um programa como
sendmail
oupostfix
que pode "entregar" o email para um destino apropriado. Nesse caso, ele será entregue em uma fila de mensagens (um arquivo no diretório/var/spool/mail
) em seu sistema local. Cada usuário no sistema pode ter uma fila neste diretório.No meu sistema Fedora, se eu iniciar
sendmail
, poderá ocorrer a entrega de correio local. Eu normalmente tenho isso embora.Agora podemos ver que minha fila de emails da minha conta de usuário
saml
está vazia:Então agora executamos o
at
trabalho:Podemos ver que o trabalho está aguardando para ser executado com
atq
:Ao executá-lo novamente após alguns minutos, podemos ver que o
at
trabalho está concluído:Aliás, com o meu MTA em execução, agora recebo esta mensagem no meu terminal:
Então, vamos verificar:
Sim, temos e-mail, então vamos dar uma olhada usando
mutt
:Temos isso na "caixa de entrada" da nossa fila de emails:
Vamos verificar este e-mail:
E funcionou.
fonte
Estou executando o Debian 8.1 (jessie)
Você pode fazer com que a saída 'at' vá para um terminal usando tty.
Um minuto depois, e 'ZZZZZ' aparecerá no seu terminal ...
fonte
As respostas acima são a maneira padrão / "correta" de fazê-lo.
Outra abordagem mais simples do ponto de vista do "usuário final" é fazer com que qualquer tarefa agendada ou em segundo plano grave sua saída em um arquivo "log". O arquivo pode estar em qualquer lugar do seu sistema, mas se a tarefa estiver sendo executada como raiz (de
cron
, etc.), em algum lugar abaixo/var/log
é um bom lugar para colocá-lo.Criei o
/var/log/maint
diretório e o tornei legível por todos e tenho um arquivo legível sob o chamado "backup", onde registro a saída dos meus scripts de backup.Criei meu próprio diretório para que meus arquivos não se misturassem com as coisas geradas pelo sistema.
Para colocar coisas lá (no bash):
O
>>
faz com que as mensagens sejam anexadas ao arquivo em vez de substituí-lo cada vez.Se meu script tem muita saída, eu uso um script ou função para saída, para que tudo seja feito da mesma maneira. Abaixo está minha versão atual (exagero): (o material VERBOSE existe para quando estou executando o script em um terminal e quero ver o que está acontecendo para fins de depuração.)
Edit:
at
exemplo simplista que grava em um arquivo de usuárioNão usei isso para sempre, então eu descobri isso com alguns scripts simples.
O primeiro script apenas agenda o evento usando
at
. O comando em si pode ser digitado em um terminal, mas sou preguiçoso - especialmente quando tenho que fazê-lo várias vezes enquanto testo sem mexer no histórico de comandos.O segundo script é o que está programado para ser executado
Eu criei os dois scripts em um editor de texto, os salvei e os tornei cada um executável usando
chmod 700 script-file-name
. Coloquei os dois no meu$HOME/bin
diretório por conveniência, mas eles podem estar em qualquer lugar em que meu usuário tenha acesso total. Eu uso700
para qualquer script que seja apenas para teste, mas em um sistema de usuário único, poderia ser755
.Eu já tenho um diretório chamado
/home/bigbird/log
para salvar a saídamytest_at_script
. Também pode estar em qualquer lugar em que seu usuário tenha acesso total. Apenas verifique se ele existe antes da execução do script ou faça com que o script o crie.Para executá-lo, certifiquei-me de que o tempo para o
at
comandomytest_at_run
fosse um pouco no futuro e, em seguida, executei-o em um terminal. Eu então esperei até ele rodar e examinei o conteúdo de$HOME/log/at.log
.Algumas notas:
Embora eu esteja fugindo
at
do meu usuário, ele não conhece meu ambiente, como o meuPATH
e o meu diretório pessoal, por isso não presumo isso. Eu uso caminhos completos como usaria para qualquercron
trabalho. E se eu quiser fazer umcron
trabalho, não precisarei mudar nada apenas para fazê-lo funcionar.I utilizado na saída de acréscimo para o arquivo de log em vez de que teria substituído-lo em cada corrida. Use o que melhor se adequar à sua aplicação.
>>
mytest_at_script
>
fonte
at
para gravar em um arquivo. Parece que você conseguiu a sequência de chamadas ao contrário no seu exemplo. Eu não sou muito bom em dizerat
quando executar o trabalho, então apenas codifiquei um tempo em um futuro muito próximo.