我的脚本(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)
在命令行上运行脚本与从 cron 运行脚本之间的主要区别在于环境。如果您得到不同的行为,请检查该行为是否可能是由于环境变量造成的。Cron 作业运行时只设置了几个变量,这些变量的值不一定与登录会话中的值相同(特别是,PATH
通常是不同的)。
如果您希望设置环境变量,请在中声明它们~/.pam_environment
(如果您的系统支持)或. ~/.profile &&
在 cron 作业的开头添加(如果您在 中声明它们.profile
)。另请参阅设置环境变量的最佳发行版/外壳不可知方式是什么?
在这种情况下,000
curl的状态表明它无法连接到服务器。通常,网络连接是系统范围的,因此网络在 cron 中的行为相同。然而,环境变量表明的一件事是任何代理使用。如果您需要代理来连接到 Web 并且您已经http_proxy
在会话启动脚本中设置了环境变量,则该设置不会应用于您的 cron 作业,这将解释失败。
-S
为您的curl
调用添加选项以显示错误消息(同时保留-s
以隐藏其他消息)。