带有curl的脚本可以手动运行,但不能在cron作业中运行

带有curl的脚本可以手动运行,但不能在cron作业中运行

我的脚本(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 无关的方法是什么?

在这种情况下,000curl 的状态表明它无法连接到服务器。通常,网络连接是系统范围的,因此 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/

相关内容