带有 curl 的脚本手动工作但不在 cron 作业中

rpa*_*anm 2 bash cron curl

我的脚本(status.sh)是:

#!/bin/bash
SITE=http://www.example.org/

STATUS=$(/usr/bin/curl -s -o /dev/null -I -w "%{http_code}" $SITE)

if [ $STATUS -eq 200 ]
then
 echo $STATUS >> /home/myuser/mysite-up.log
else
 echo $STATUS >> /home/myuser/mysite-down.log
fi
Run Code Online (Sandbox Code Playgroud)

我跑:

$ chmod +x /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)

然后在我的 crontab 上我得到了:

* * * * * /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)

当我运行时:

$ /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)

该文件/home/myuser/mysite-up.log包含:

200
Run Code Online (Sandbox Code Playgroud)

但是当 cron 运行时,该文件/home/myuser/mysite-up.log包含:

000
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

编辑: 我修改了脚本添加:

set -x
Run Code Online (Sandbox Code Playgroud)

正如@Sobrique 所建议的,我的输出是:

 SITE=http://www.example.org/
 /usr/bin/curl -s -o /dev/null -I -w '%{http_code}' http://www.example.org/
 STATUS=000
 '[' 000 -eq 200 ']'
 echo 000
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 7

在命令行上运行脚本与从 cron 运行脚本之间的主要区别在于环境。如果您得到不同的行为,请检查该行为是否可能是由于环境变量造成的。Cron 作业运行时只设置了几个变量,这些变量的值不一定与登录会话中的值相同(特别是,PATH通常是不同的)。

如果您希望设置环境变量,请在中声明它们~/.pam_environment(如果您的系统支持)或. ~/.profile &&在 cron 作业的开头添加(如果您在 中声明它们.profile)。另请参阅设置环境变量的最佳发行版/外壳不可知方式是什么?

在这种情况下,000curl的状态表明它无法连接到服务器。通常,网络连接是系统范围的,因此网络在 cron 中的行为相同。然而,环境变量表明的一件事是任何代理使用。如果您需要代理来连接到 Web 并且您已经http_proxy在会话启动脚本中设置了环境变量,则该设置不会应用于您的 cron 作业,这将解释失败。

-S为您的curl调用添加选项以显示错误消息(同时保留-s以隐藏其他消息)。