Obtendo a saída de uma tarefa cron no terminal

13

Eu tenho um programa que imprime alguns resultados que gostaria de exibir 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?

    
por user168328 18.06.2013 / 21:31

3 respostas

11

O caminho sujo 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 tty command

~$ tty
/dev/pts/4

então o seu crontab seria:

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

Outra maneira seria lançar o programa como um argumento do terminal:

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

onde display é o display X onde você quer mostrar o terminal, -H é para dizer ao terminal para permanecer aberto após o comando ser finalizado. Isso irá 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 exibição não estiver presente, você terá um erro registrado pelo syslog.

    
por Artix 18.06.2013 / 23:19
5

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

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

Se você quiser que seu cron job seja enviado para um terminal, você terá que 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 há resposta universal para isso, depende de como você deseja selecionar o terminal entre os que você está conectado.

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

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"
    
por Gilles 19.06.2013 / 02:06
2

Cron envia a saída para um mailer. Se você quiser ver a saída em um terminal, então você pode logar em um arquivo e usar tail -f para ver a saída no terminal que você quer ver a saída

Faça login 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

Alternativas para registrar:

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

Programa de exemplo 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 seu registro padrão e erro padrão em um arquivo, em qualquer terminal, você pode executar tail -f em um ou ambos os arquivos, como tail -f log.txt ou tail -f log.txt error.txt , para que a cauda assista ou prefira seguir o arquivo (s) para emendas. página principal do homem

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

==> error.txt <==
sample error

Registrando arquivos anexados depois:

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 executando $ tail -f log.txt error.txt

==> log.txt <==
more output

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

==> error.txt <==
code red
    
por Keith Reynolds 08.01.2016 / 16:11