从终端上的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.txt
或tail -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