我有一个crontab
root
如下所示的文件:
lab-1:/var/www/cdd# crontab -l
# do daily/weekly/monthly maintenance
# min hour day month weekday command
* * * * * /etc/scripts/script1
*/15 * * * * /etc/scripts/script2
0 * * * * /etc/scripts/script3
我可以看到所有作业都是通过运行以下命令触发的:
lab-1:/var/www/cdd# cat /var/log/messages | grep cron.info
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26217 cmd /etc/scripts/script2
Mar 15 13:00:00 lab-1 cron.info crond[7897]: USER root pid 26219 cmd /etc/scripts/script3
Mar 15 13:01:00 lab-1 cron.info crond[7897]: USER root pid 26293 cmd /etc/scripts/script1
问题是 script3 (我已经证明 script2 和 script1 可以工作)实际上并没有产生预期的输出。它应该在另一个文件夹中创建文件。但是,当我像这样手动运行它时,它工作得很好:
lab-1:/etc/scripts# bash script3
我不是真正的系统管理员,因此不太确定解决此问题的最佳方法是什么。
首先想到的是权限。
lab-1:/etc/scripts# ls -lah
total 24
drwxr-xr-x 2 root root 4.0K Mar 15 12:20 .
drwxr-xr-x 34 root root 4.0K Mar 14 17:11 ..
-rwxr-xr-x 1 root root 5.0K Mar 15 12:19 script3
-rwxr-xr-x 1 root root 1.8K Mar 14 15:26 script1
-rwxr-xr-x 1 root root 1.9K Mar 14 15:26 script2
/var/log/messages
虽然...话虽如此,如果这是一个权限问题,它甚至会在我的文件中显示为被触发/启动吗?
我应该如何进行?
编辑1
lab-1:/etc/scripts# ./script3 | head -n 4
Working folder set to: /tmp/tmp.kOfhip
*****Grab SQL Data from Remote Server: spp.mydomain.net *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.1' (ECDSA) to the list of known hosts.
Evaluate /tmp/tmp.kOfhip/spp.mydomain.net.db
lab-1:/etc/scripts#
编辑2
我的脚本如下所示:
https://paste.pound-python.org/show/90vAlrOsAYP0CtYqNWfl/
如您所见,我正在创建一个临时文件夹并在其中完成所有工作。
编辑3
为了向自己证明这不是因为像第 9 行这样的行,我注释掉了除第 1 行到第 15 行之外的所有内容。我添加了执行此操作的第 16 行:
echo "done" >> /tmp/results.txt
然后我将作业的时间表更改为从一小时开始每两分钟运行一次。我可以看到它已经运行了 3 次。我想我会继续这种方法,直到我发现一些不起作用/爆炸的东西。我不太明白下面关于使用 PATH 变量的评论......但我想我会用谷歌搜索它。
编辑4
我更改了 crontabs 根文件,以便它将 script3 的结果输出到文件中,这就是我所看到的:
Working folder set to: /tmp/tmp.GeNGDJ
*****Grab SQL Data from Remote Server: servername *****
COPY 344
Warning: Permanently added 'spp.mydomain.net,10.1.1.132' (ECDSA) to the list of known hosts.
Permission denied (publickey,keyboard-interactive).
Evaluate /tmp/tmp.GeNGDJ/spp.mydomain.net.db
cat: can't open '/tmp/tmp.GeNGDJ/spp.mydomain.net.db': No such file or directory
所以它在尝试 scp 文件时死掉了。远程 SQL 运行良好并显示输出。但正如你所看到的,我的权限被拒绝但是如果我手动运行相同的命令,它似乎可以工作。还得继续摸索。将尝试像下面的答案中建议的那样转储 ENV。
答案1
在编写稍后由 cron 执行的脚本时,一个常见的错误是您假设该脚本将具有与您登录并开发它时完全相同的环境。还没有!
编写一个包含以下行的脚本4
OFILE=/tmp/crons.environment
(/usr/bin/whoami
/usr/bin/env ) > $OFILE 2>&1
并让 cron 运行它
现在将 /tmp/crons.environment 中的输出与您刚刚键入时得到的输出进行比较env
例如,您的脚本假设 $PATH 设置正确以查找您执行的所有程序,您还在查询数据库,这些命令可能需要更多环境变量才能正确运行。
检查 cron 作业的输出。暂时修改 cron 运行的命令并将 stdout 和 stderr 重定向到已知文件,就像我上面所做的那样。
0 * * * * /etc/scripts/script3 > /tmp/s3.out 2>&1