我想知道如何确切地看到cron作业在每次执行时都在做什么.日志文件位于何处?或者我可以将输出发送到我的电子邮件吗?我已经设置了电子邮件地址,以便在cron作业运行时发送日志,但我还没有收到任何信息.
Spl*_*ter 317
* * * * * myjob.sh >> /var/log/myjob.log 2>&1
Run Code Online (Sandbox Code Playgroud)
将所有输出从cron作业记录到/var/log/myjob.log
您可能会mail用来发送电子邮件.大多数系统会cron通过电子邮件将未处理的作业输出发送到root或相应的用户.
Mat*_*ock 59
默认情况下,cron会记录到/ var/log/syslog,因此您可以使用以下命令查看与cron相关的条目:
grep CRON /var/log/syslog
Run Code Online (Sandbox Code Playgroud)
https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log
Hai*_*mei 10
这是我的代码:
* * * * * your_script_fullpath >> your_log_path 2>&1
Run Code Online (Sandbox Code Playgroud)
Dav*_*d L 10
至少有三种不同类型的日志记录:
执行程序之前的日志记录,只记录cronjob TRIED以执行命令.那个位于/ var/log/syslog中,正如@Matthew Lock已经提到的那样.
程序试图执行后记录错误,可以发送到电子邮件或文件,如@Spliffster所述.我更喜欢登录到文件,因为有了电子邮件,那么你有一个新的问题来源,并检查电子邮件发送和接收是否完美.有时是,有时不是.例如,在一个简单的常见桌面计算机中,您对配置smtp不感兴趣,有时您更喜欢记录到文件:
* * * * COMMAND_ABSOLUTE_PATH > /ABSOLUTE_PATH_TO_LOG 2>&1
Run Code Online (Sandbox Code Playgroud)
cronjobs存在一些常见问题:*要执行的二进制文件的ABSOLUTE PATH.当你从shell运行它时,它可能会工作,但cron进程似乎使用另一个环境,因此如果你不使用绝对路径它并不总是找到二进制文件.*二进制文件使用的库.它或多或少与前一点相同,但要确保,如果只是简单地输入命令的名称,就是指使用相同库的二进制文件,或者更好,检查您使用绝对路径引用的二进制文件与您直接使用控制台时引用的内容完全相同.可以使用locate命令找到二进制文件,例如:
$locate python
Run Code Online (Sandbox Code Playgroud)
确保您将引用的二进制文件与您在shell中调用的二进制文件完全相同,或者只是使用您计划放入cronjob的绝对路径在shell中再次测试.
小智 7
使用命令crontab -e,然后将 cron 作业编辑为
* * * * * /path/file.sh > /pathToKeepLogs/logFileName.log 2>&1
Run Code Online (Sandbox Code Playgroud)
这里,2>&1表示标准错误 ( 2>) 被重定向到标准输出 ( ) 指向的同一文件描述符&1。
在Ubuntu上,您可以使cron.log文件仅包含CRON条目。
取消对中提到行cron的 /etc/rsyslog.d/50-default.conf文件:
# Default rules for rsyslog.
#
# For more information see rsyslog.conf(5) and /etc/rsyslog.conf
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
#cron.* /var/log/cron.log
Run Code Online (Sandbox Code Playgroud)
保存并关闭文件,然后重新启动rsyslog服务:
sudo systemctl restart rsyslog
Run Code Online (Sandbox Code Playgroud)
现在,您可以在自己的文件中看到cron日志条目:
sudo tail -f /var/log/cron.log
Run Code Online (Sandbox Code Playgroud)
样本输出:
Jul 18 07:05:01 machine-host-name CRON[13638]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Run Code Online (Sandbox Code Playgroud)
但是,您将不会看到有关在/etc/cron.daily或中实际运行了哪些脚本的更多信息/etc/cron.hourly,除非这些脚本将输出定向到cron.log(或其他一些日志文件)。
如果要验证crontab是否正在运行并且不必在cron.log或中搜索它syslog,请创建一个crontab,以将输出重定向到您选择的日志文件-类似:
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
30 2 * * 1 /usr/local/sbin/certbot-auto renew >> /var/log/le-renew.log 2>&1
Run Code Online (Sandbox Code Playgroud)
步骤来自:https : //www.cyberciti.biz/faq/howto-create-cron-log-file-to-log-crontab-logs-in-ubuntu-linux/
cron 已经通过邮件将其运行的每个作业的标准输出和标准错误发送给cron作业的所有者。
您可以MAILTO=recipient在crontab文件中使用,以将电子邮件发送到其他帐户。
为此,您需要使邮件正常工作。传递到本地邮箱通常不是问题(实际上,很可能ls -l "$MAIL"会发现您已经收到了一些邮件),但要立即使用它并上网,则需要MTA(Postfix,Sendmail,您拥有什么)才能正确配置以连接世界。
如果没有输出,将不会生成电子邮件。
常见的安排是将输出重定向到文件,在这种情况下,cron守护程序当然不会看到作业返回任何输出。一种变体是将标准输出重定向到文件(或编写脚本,使其从不打印任何内容-也许将结果存储在数据库中,或者执行仅不输出任何内容的维护任务?),并且仅在存在时接收电子邮件是错误消息。
要重定向两个输出流,语法为
42 17 * * * script >>stdout.log 2>>stderr.log
Run Code Online (Sandbox Code Playgroud)
请注意,我们如何附加(double >>)而不是覆盖,因此上一个作业的输出不会被下一个作业的输出取代。
正如此处许多答案所建议的那样,您可以将两个输出流都发送到一个文件中。替换为第二个重定向,2>&1并说“标准错误应该在标准输出所处的任何地方”。(但是我并不特别赞成这种做法。如果您对标准输出不抱有任何期望,但是可能已经忽略了某些东西,也许是来自脚本调用的外部工具,这在很大程度上是有意义的。)
cron作业在您的主目录中运行,因此任何相对文件名都应与此相对。如果要在主目录之外进行写操作,显然需要单独确保对目标文件具有写权限。
常见的反模式是将所有内容重定向到/dev/null(然后请求Stack Overflow来帮助您确定什么地方不起作用时出了什么问题;但是我们也看不到丢失的输出!)
在脚本中,请确保将常规输出(实际结果,理想情况下以机器可读的形式)和诊断(通常为人类阅读器格式化)分开。在shell脚本中,
echo "$results" # regular results go to stdout
echo "$0: something went wrong" >&2
Run Code Online (Sandbox Code Playgroud)
某些平台(例如GNU Awk)允许您使用文件名/dev/stderr来显示错误消息,但这不能正确移植。在Perl中,warn并die打印到标准错误;在Python中,写入sys.stderr或使用logging; 在Ruby中,请尝试$stderr.puts。还请注意,错误消息应如何包括产生诊断消息的脚本的名称。
| 归档时间: |
|
| 查看次数: |
237268 次 |
| 最近记录: |