我的脚本(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
我跑:
$ chmod +x /home/myuser/status.sh
然后在我的 crontab 上我得到:
* * * * * /home/myuser/status.sh
当我跑步时:
$ /home/myuser/status.sh
该文件/home/myuser/mysite-up.log
包含:
200
但是当 cron 运行时,该文件/home/myuser/mysite-up.log
包含:
000
我做错了什么?
编辑: 我修改了脚本添加:
set -x
正如@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
答案1
在命令行上运行脚本和从 cron 运行脚本之间的主要区别在于环境。如果您得到不同的行为,请检查该行为是否可能是由环境变量引起的。 Cron 作业仅在设置了几个变量的情况下运行,并且这些变量不一定与登录会话中的值相同(特别PATH
是通常不同)。
如果您希望设置环境变量,请在 中声明它们~/.pam_environment
(如果您的系统支持)或. ~/.profile &&
在 cron 作业的开头添加(如果您在 中声明它们.profile
)。也可以看看设置环境变量的最佳发行版/与 shell 无关的方法是什么?
在这种情况下,000
curl 的状态表明它无法连接到服务器。通常,网络连接是系统范围的,因此 cron 中的网络行为相同。然而,环境变量指示的一件事是任何代理的使用。如果您需要代理来连接到网络,并且您已http_proxy
在会话启动脚本中设置了环境变量,则该设置不会应用到您的 cron 作业中,这可以解释失败的原因。
将选项添加-S
到您的curl
调用中以显示错误消息(同时保留-s
隐藏其他消息)。
答案2
cron 使用的curl 可能与终端/shell 中使用的不同。检查终端(它正在工作的地方),然后直接在 cron 或 cron 调用的 shell 脚本中检查which curl
,而不仅仅是curl https://www.example.com/
使用完整路径:/home/myusername/anaconda3/bin/curl https://www.example.com/
。