Obtendo saída de um trabalho cron no terminal

15

Eu tenho um programa que imprime alguma saída que eu gostaria que aparecesse no meu terminal uma vez a cada hora durante o dia de trabalho.

$ crontab -l
0 07-17 * * * /home/dat/scripts/cron.out

O syslog relata o seguinte:

(dat) CMD (/home/dat/scripts/cron.exe)
Jun 18 12:02:01 picard CRON[10848]: (CRON) info (No MTA installed, discarding output)

o que estou perdendo?

user168328
fonte
os trabalhos cron não devem gravar em um terminal - pode não haver nenhum disponível.
guntbert

Respostas:

14

A maneira suja pode ser redirecionar a saída do seu programa para o arquivo pts de um terminal já existente .

Para conhecer o arquivo pts, basta digitar ttycommand

~$ tty
/dev/pts/4

seu crontab seria:

0 07-17 * * * /home/dat/scripts/cron.out > /dev/pts/4

Outra maneira poderia ser o lançamento do programa como argumento do terminal:

xfce4-terminal --command=/home/dat/scripts/cron.out --display=:0.0 -H

onde displayé a tela X onde você deseja mostrar o terminal, -Hé dizer ao terminal para permanecer aberto após o término do comando. Isso criará toda vez que um novo terminal.

crontab:

0 07-17 * * * /usr/bin/xfce4-terminal --display=:0.0 -H --command=/home/dat/scripts/cron.out

se a tela não estiver presente, você terá um erro registrado pelo syslog.

Artix
fonte
6

Cron envia por e-mail a saída do seu script. Infelizmente, o Ubuntu não configura o correio local por padrão , e é por isso que o Cron diz nos logs "Nenhum MTA instalado, descartando a saída".

Configurar correio local pode ser uma maneira de resolver seu problema. Em vez de uma saída em um terminal, você receberá uma notificação por email.

Se você deseja que seu trabalho cron seja enviado para um terminal, será necessário redirecionar sua saída para o terminal. A parte de redirecionamento é fácil -

0 07-17 * * * /home/dat/scripts/cron.out >/dev/pts/42 2>&1

mas o problema é descobrir para qual terminal redirecionar. Não existe uma resposta universal para isso, depende de como você deseja selecionar o terminal entre aqueles em que está conectado.

Para usos típicos, uma notificação da GUI seria mais apropriada. Você pode usar notify-send. Você precisará definir a DISPLAYvariável de ambiente .

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"
Gilles 'SO- parar de ser mau'
fonte
2

Cron envia a saída para uma mala direta. Se você deseja ver a saída em um terminal, pode efetuar logon em um arquivo e usar tail -f para visualizar a saída no terminal em que deseja ver a saída


Faça logon em um arquivo

  • A resposta mais simples é registrar diretamente em um arquivo com uma entrada crontab como:

0 07-17 * * * /home/dat/scripts/cron.out > /path/to/log.txt 2> /path/to/error.txt

Formas alternativas de log:

  • Se o seu programa for um script que possa ser gravado, você poderá modificá-lo para redirecionar a saída para um arquivo de log. echo output > log.txt, ou você pode usar um script de wrapper descrito abaixo.
  • Se o seu programa é binário ou não pode ser gravado, você deve escrever um script de wrapper para capturar a saída em um arquivo.

Exemplo de programa e script de wrapper:

$ cat program.sh wrapper.sh 
#!/bin/bash
# sample program
echo "arg 1=$1 arg2=$2 arg3=$3"
echo "sample error" >&2 

#!/bin/bash
# sample wrapper
exec ./program.sh "$@" >log.txt 2> error.txt

Exemplo de execução 1:

$ ./wrapper.sh 1 2 3 ; cat error.txt  log.txt 
sample error
arg 1=1 arg2=2 arg3=3

Exemplo de execução 2:

$ ./wrapper.sh "A B C" D E ; cat error.txt log.txt 
sample error
arg 1=A B C arg2=D arg3=E

Ver saída no terminal:

Agora que o seu login ambos fora padrão e erro padrão para um arquivo, em qualquer terminal, você pode executar tail -fem um ou ambos os arquivos como tail -f log.txtou tail -f log.txt error.txtpara que a cauda vai assistir ou melhor seguir o arquivo (s) de alteração. página de manual da cauda

$ tail -f log.txt  error.txt
==> log.txt <==
arg 1=1 arg2=2 arg3=3

==> error.txt <==
sample error

Arquivos de log anexados posteriormente:

Se log.txt ou error.txt forem anexados posteriormente a partir do seu programa ou de outro terminal como $ echo "more output" >> log.txt, a saída será vista no terminal em execução$ tail -f log.txt error.txt

==> log.txt <==
more output

Além disso, $ echo code red >> error.txtresulta em:

==> error.txt <==
code red
Keith Reynolds
fonte