Questão Pergunta sobre a


Eu tentei usar no para agendar um trabalho em execução em um horário específico. Eu tenho um computador Mac. Por exemplo, tentei testar isso para o seguinte no Terminal:

at now + 1 minute
echo 'Test at'
<EOD>

depois de mais de 1 minuto, não vi o eco. Depois de digitar o seguinte comando:

at -l

Eu não vi nenhum trabalho, mas recebi uma mensagem dizendo que tenho um e-mail. Eu fui ao meu e-mail pelo comando de correio. Eu vi uma mensagem e eu digitei 1. Eu vi a saída do meu trabalho está no correio.

Minha primeira pergunta é que eu não tenho certeza se este é o comportamento padrão para um comando ou não. Existe alguma maneira de mudar este comportamento e como alterá-lo direcionar o resultado para onde, se possível.

Meu entendimento é que, se o meu trabalho agendado tiver alguma mensagem, a mensagem de saída será enviada de volta para o meu e-mail. Minha próxima pergunta relacionada é que não tenho certeza de onde o trabalho agendado é executado. Em um fundo? Eu não consegui encontrá-lo usando o comando fg ou bg.


2


origem




Respostas:


É de fato o comportamento padrão de a como afirmado em homem em:

O usuário receberá o erro padrão e a saída padrão de seus comandos, se houver. O correio será enviado usando o comando sendmail (8). Se at for executado a partir de um shell su (1), o proprietário do shell de login receberá o email.

Para um comportamento diferente, você pode invocar a como isso:

$ at now + 1 minute 
$ echo "test at" > /dev/ttys000
$ <EOD>

Que irá redirecionar STDOUT para o terminal ttys000. Você precisa substituir / dev / ttys000 com o arquivo de dispositivo correspondente do seu terminal, que você pode determinar executando o seguinte comando:

$ tty

Os trabalhos agendados são executados em seu próprio shell (veja homem em para mais detalhes), de tal forma que bg não irá listá-los. Para ver uma lista de trabalhos agendados, você pode querer tentar atq ou em -l 


3



Eu comentei anteriormente que, em vez de usar o tty comando para procurar o atual tty, você poderia usar o genérico / dev / tty que sempre representa o atual terminal de trabalho. Isso é verdade, mas agora acho que isso não funcionará nos comandos, já que eles são executados em um ambiente sem um terminal de controle. Você deve voltar ao seu conselho original para encontrar o terminal atual e redirecioná-lo para ele. Desculpe pela desinformação. - nagul
Você está certo nagul, obrigado! - dblu
O endereço de e-mail é um endereço padrão do correio UNIX. Existe alguma maneira de redirecionar para o meu iMail que poderia ser gmail ou minha conta de e-mail do provedor de internet? Outra maneira pode ser que eu configurei meu e-mail local para redirecionar e-mails para minha caixa do iMail. Ou posso configurar meu iMail para abrir minha caixa de correio local? - David.Chu.ca


Sim, enviar o usuário que chamou o comando at é o comportamento padrão.

Na página man:

Como os comandos são executados em uma chamada de shell separada, sendo executados em um grupo de processos separado sem nenhum terminal de controle, os descritores, traps e prioridades de arquivos abertos herdados do ambiente de chamada são perdidos.

Como resultado do acima, não há maneira fácil de comunicar a saída dos comandos. É claro que você pode redirecionar a saída para um arquivo ou usar um mecanismo alternativo para comunicar a saída, como parte dos comandos.

Se você não vê o trabalho agendado, é porque há um daemon atd rodando no sistema que recebe e executa os jobs at. Em um Mac, eles podem ser manipulados pelo launchd daemon que é o daemon de substituição tudo-em-um da Apple:

O daemon launchd é essencialmente um substituto para os scripts init, rc, init.d e rc.d, SystemStarter (Mac OS X), inetd e xinetd, atd, crond e watchdogd. A Apple afirmou que pretende eliminar todos os serviços acima mencionados em favor do lançamento


4