通过cron从url执行bash脚本

时间:2014-05-27 19:35:35

标签: bash curl cron

我正在尝试使用云服务器(根据我保存的图像构建)在启动时从URL执行脚本,但脚本未正确执行。

我使用Execute bash script from URL中的一个答案来配置curl脚本,并通过crontab(Ubuntu 14.04)中的@reboot指令执行该脚本。我的设置如下:

该脚本包含以下命令:

user@cloud-server-01:~$ cat startup.sh
#! /bin/sh
/usr/bin/curl -s http://192.168.100.59/user/startup.sh.txt | bash /dev/stdin

我通过crontab调用脚本:

user@cloud-server-01:~$ crontab -l
@reboot /home/user/startup.sh > startup.log 2>&1 &

如果我使用完全相同的命令从命令行手动执行脚本,它可以正常工作。但是,在启动时由crontab执行,它似乎挂起,我看到以下进程正在运行:

user@cloud-server-01:~$ ps ux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user      1287  0.0  0.1   4444   632 ?        S    19:17   0:00 /bin/sh /home/user/startup.sh
user      1290  0.0  0.7  89536  3536 ?        S    19:17   0:00 /usr/bin/curl -s http://192.168.100.59/user/startup.sh.txt
user      1291  0.0  0.2  12632  1196 ?        S    19:17   0:00 bash /dev/stdin

我错过了一些明显的原因,为什么cron执行并没有给我与命令行相同的结果?

编辑:

感谢Olof重定向我的问题排查。事实上,卷曲正在执行,如果我等待足够长的时间(几分钟),它似乎按照需要运行。我怀疑问题是当最初调用curl时网络接口和/或URL不可用,并且虽然它可能轮询连接,但它可能会退回其轮询间隔。所以问题现在变成了,"如何在调用curl之前检查我是否有与此URL的连接?"

解答:

由于云提供商的脚本在重启后需要20-40秒,因此当我第一次执行cron时,我所需的连接IP不可用。它会超时,或在显着延迟后连接。我已经修改了我的连接脚本以轮询连接,直到它在调用curl之前可用:

#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOST_IP=192.168.100.59

check_online() {
    IS_ONLINE=$(netcat -z -w 5 $HOST_IP 80 && echo 1 || echo 0)
}

# Initial check to see if we're online
check_online

# Loop while we're not online.
while [ $IS_ONLINE -eq 0 ];do
    # We're offline. Sleep for a bit, then check again
    sleep 5;
    check_online
done

# Run remote script
bash <(curl -s http://${HOST_IP}/user/startup.sh.txt)

1 个答案:

答案 0 :(得分:1)

这不是一个重击问题;你的curl命令仍然在运行,所以bash仍在运行,等待curl关闭bash shell正在读取的管道。

要对curl调用进行故障排除,我会首先运行它而不用bash来检查我是否得到了我预期的输出。