Obteniendo salida de un trabajo cron en la terminal


15

Tengo un programa que imprime algunos resultados que me gustaría mostrar en mi terminal una vez cada hora durante la jornada laboral.

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

syslog informa lo siguiente:

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

¿Qué me estoy perdiendo?


No se supone que los trabajos cron escriban en un terminal; puede que no haya ninguno disponible.
guntbert

Respuestas:


14

La manera sucia podría ser redirigir la salida de su programa al archivo pts de un terminal ya existente .

Para conocer el archivo pts simplemente escriba ttycommand

~$ tty
/dev/pts/4

entonces su crontab sería:

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

Otra forma podría ser iniciar el programa como argumento del terminal:

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

dónde displayestá la pantalla X donde desea mostrar el terminal, -Hes decirle al terminal que permanezca abierto después de que finalice el comando. Esto creará cada vez un nuevo terminal.

crontab:

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

Si la pantalla no está presente, syslog registrará un error.


6

Cron le envía por correo electrónico la salida de su script. Desafortunadamente, Ubuntu no configura el correo local por defecto , por eso Cron le dice en los registros "No hay MTA instalado, descartando la salida".

Configurar el correo local podría ser una forma de resolver su problema. En lugar de una salida en una terminal, recibiría una notificación por correo electrónico.

Si desea que su trabajo cron salga a una terminal, deberá redirigir su salida a la terminal. La parte de redireccionamiento es fácil:

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

pero el problema es averiguar a qué terminal redirigir. No hay una respuesta universal a eso, depende de cómo desee seleccionar el terminal entre los que está conectado.

Para usos típicos, una notificación de GUI sería más apropiada. Puedes usar notify-send. Deberá establecer la DISPLAYvariable de entorno .

0 07-17 * * * DISPLAY=:0 notify-send "$(/home/dat/scripts/cron.out)"

2

Cron envía la salida a un anuncio publicitario. Si desea ver la salida en una terminal, puede iniciar sesión en un archivo y usar tail -f para ver la salida en la terminal en la que desea ver la salida


Iniciar sesión en un archivo

  • La respuesta más simple es iniciar sesión directamente en un archivo con una entrada crontab como:

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

Formas alternativas de iniciar sesión:

  • Si su programa es un script en el que se puede escribir, puede modificarlo para redirigir la salida a un archivo de registro. echo output > log.txt, o puede usar una secuencia de comandos de contenedor que se describe a continuación.
  • Si su programa es binario o no se puede escribir de otro modo, debe escribir un script de contenedor para capturar la salida a un archivo.

Programa de ejemplo y script de contenedor:

$ 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

Ejemplo de ejecución 1:

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

Ejemplo de ejecución 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 salida en terminal:

Ahora que su registro a cabo tanto estándar y el error estándar a un archivo, en cualquier terminal, puede ejecutar tail -fen uno o ambos archivos como tail -f log.txto tail -f log.txt error.txtpara que la cola velará o más bien seguir el archivo (s) de modificación. cola man-page

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

==> error.txt <==
sample error

Archivos de registro añadidos después:

Si log.txt o error.txt se agregan posteriormente desde su programa o desde otro terminal como $ echo "more output" >> log.txt, la salida se ve en el terminal en ejecución$ tail -f log.txt error.txt

==> log.txt <==
more output

Además, $ echo code red >> error.txtresulta en:

==> error.txt <==
code red
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.