从终端上的cron作业获取输出

我有一个程序打印一些输出,我希望在工作日每小时在终端上弹出一次。

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

syslog报告以下内容:

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

我错过了什么?

脏的方法可能是将程序的输出重定向到现有终端的pts文件。

要知道pts文件只需输入tty命令

 ~$ tty /dev/pts/4 

然后你的crontab将是:

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

另一种方法是启动程序作为终端的参数:

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

其中display是要显示终端的X显示, -H是命令终止后告诉终端保持打开状态。 这将创建每次新的终端。

crontab中:

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

如果显示不存在,您将在syslog中记录错误。

Cron会通过电子邮件向您发送脚本输出。 不幸的是, 默认情况下Ubuntu没有设置本地邮件 ,这就是为什么Cron在日志中告诉你“没有安装MTA ,丢弃输出”。

设置本地邮件可能是解决问题的一种方法。 您将收到电子邮件通知,而不是终端中的输出。

如果您希望将cron作业输出到终端,则必须将其输出重定向到终端。 重定向部分很简单 –

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

但问题是弄清楚要重定向到哪个终端。 对此没有通用答案,这取决于您要如何在登录的终端中选择终端。

对于典型用途,GUI通知更合适。 您可以使用notify-send 。 您需要设置DISPLAY环境变量 。

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

Cron将输出发送到邮件程序。 如果要在终端中查看输出,则可以登录到文件并使用tail -f查看要查看输出的终端中的输出


登录到文件

  • 最简单的答案是直接使用crontab条目登录到文件,如:

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

替代方法记录:

  • 如果您的程序是可以写入的脚本,您可以修改它以将输出重定向到日志文件。 echo output > log.txt ,或者您可以使用下面描述的包装器脚本。
  • 如果您的程序是二进制或其他不可写的,那么您必须编写包装器脚本以将输出捕获到文件。

示例程序和包装脚本:

 $ 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 

示例运行1:

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

示例运行2:

 $ ./wrapper.sh "ABC" DE ; cat error.txt log.txt sample error arg 1=ABC arg2=D arg3=E 

查看终端输出:

现在您的日志记录标准输出和标准错误到文件,在任何终端,您可以在一个或两个文件上运行tail -f ,如tail -f log.txttail -f log.txt error.txt以便尾部将注意或者更确切地按照文件进行修改。 尾页手册

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

记录后续追加的文件:

如果log.txt或error.txt后来从您的程序或另一个终端追加,如$ echo "more output" >> log.txt ,则在运行$ tail -f log.txt error.txt的终端上看到输出

 ==> log.txt <== more output 

此外, $ echo code red >> error.txt导致:

 ==> error.txt <== code red