我尝试使用运行python3脚本的crontab运行shell脚本 . crontab用于用户组 . 现在它运行脚本但不运行其中的python3脚本 . 我尝试调试它,但我无法弄清楚会发生什么 . 它可能是一个权限问题或路径问题,但我无法弄清楚 . 这是行crontab
*/5 * * * * /home/group_name/path/to/script/run.sh
正如我所说的cron工作被执行或至少就是我的想法,因为当我运行 sudo grep CRON /var/log/syslog
时,我得到了像
Feb 16 20:35:01 ip-**-**-*-*** CRON[4947]: (group_name) CMD (/home/group_name/path/to/script/run.sh)
在下面我也得到一条可能与问题有关的线
Feb 16 20:35:01 ip-**-**-*-*** CRON[4946]: (CRON) info (No MTA installed, discarding output)
最后 run.sh
看起来像这样
#!/bin/bash
# get path to script and path to script directory
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
echo "set directory"
cd "$SCRIPTPATH"
echo "run first script"
/usr/bin/python3 ./first_script.py > ./log1.txt
但是当cron作业执行时没有任何反应,当我手动运行它时,数据库的cahnges按预期发生 . 该集团拥有与我相同的权利 . shell文件可以由我执行,组和python文件不能由我执行,所以我不知道为什么该组需要这个 .
PS:我想在shell中执行python脚本,因为我们有很多脚本,有时会有很多参数,因此crontab会变得人满为患,而且某些脚本必须以特定的顺序执行 .
编辑:在 #! /bin.bash
之后添加 exec >> /tmp/output 2>&1
将回波写入 /tmp/output
,无论何时我手动运行它,但不是当我在cron中运行它时,甚至在运行任何python脚本之前都没有 .
直接从cron运行其中一个python脚本,但即使我复制粘贴与在cron中工作的行完全相同的行,也没有任何反应 .
6 回答
这个问题有很多组成部分 . 我忽略了MTA错误,因为这只是当您的cron作业完成时的电子邮件通知 . 我还假设您已正确设置权限,并且在shell中手动运行时脚本运行正常 .
最大的问题是CRON命令与从终端“shell”运行命令不同 . 您必须指定使用bash运行脚本 . 从以下位置更改您的cron作业:
至:
This question有更多信息和解决问题的其他选项 .
改变这一行:
至:
关于/ var / log / syslog,当您查看/ var / log / syslog时,请查看时间戳以确定是否正在运行cron作业 .
关于cron作业无法写入log.txt,它可能与权限有关 . 尝试更改此行:
至:
看看是否有任何区别 . cron应该能够写入/ tmp .
1)消息“没有安装MTA”并不意味着任何错误,它只表示没有邮件服务器的cron无法报告任何细节 .
修改cron作业以记录其输出into syslog:
然后通过
sudo tail -f /var/log/syslog
(或RedHat和SuSE上的sudo tail -f /var/log/messages
)检查结果或者,install Postfix并将其配置为"local only"交付:
然后将邮件检查为
group_name
用户 .2)
run.sh
中的重定向> ./log1.txt
应在每次执行时覆盖日志文件 . 如果python脚本失败并出现异常,则log1.txt
将保持截断为零长度 . 在这种情况下修改run.sh
的最后一行:并检查结果 .
如果
log1.txt
既未被截断也未包含新输出,则根本不会启动python脚本 . 请参阅步骤1)以调试run.sh
.bash脚本中的最后一行包含相对路径(./)我相信这是问题所在
目前有很多关于这个问题的猜测,那是因为您的系统无法向您发送故障电子邮件以准确解释问题所在 . 一段时间我遇到了类似的问题,试图 Build 一个实际的邮件系统不堪重负,于是写了一封短邮件转发sendmail替身:
pygeon_mail
:它是为Python 2.5编写的,应该与2.6和2.7一起使用 .
它需要复制到
/usr/sbin/sendmail
,权限为0755并由root拥有:您需要创建一个
/etc/pygeon_mail.rc
配置文件(请参阅代码示例) .然后,您可以使用以下内容进行测试:
并且您希望在普通电子邮件帐户(您在
/etc/pygeon_mail.rc
文件中设置)中看到该电子邮件 .在那之后,你应该能够得到实际的错误,我们实际上可以提供帮助您
如果您记录使用cron调用的脚本的输出,则可以非常轻松地找到错误 . 尝试这样的事情:
*/10 * * * * sh /bin/execute/this/script.sh >> /var/log/script_output.log 2>&1