![记录到文件](https://linux22.com/image/950301/%E8%AE%B0%E5%BD%95%E5%88%B0%E6%96%87%E4%BB%B6.png)
我有一个程序可以打印一些输出,我希望这些输出在工作日期间每小时弹出一次在我的终端上。
$ 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)
我错过了什么?
答案1
肮脏的方法可能是将程序的输出重定向到已经存在终端。
要查看 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
如果没有显示,系统日志将会记录一个错误。
答案2
Cron 会通过电子邮件向您发送脚本的输出。不幸的是,Ubuntu 默认不设置本地邮件,这就是为什么 Cron 在日志中告诉你“不大都会运输署安装,丢弃输出”。
设置本地邮件可能是解决问题的一种方法。您将收到电子邮件通知,而不是终端中的输出。
如果你希望你的 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)"
答案3
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 "A B C" D E ; cat error.txt log.txt
sample error
arg 1=A B C arg2=D arg3=E
在终端中查看输出:
现在,您已将标准输出和标准错误都记录到一个文件中,在任何终端中,您都可以tail -f
在一个或两个文件上运行,例如tail -f log.txt
或tail -f log.txt error.txt
,这样 tail 就会监视或跟踪文件进行修改。 tail 手册页
$ 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