cron 仅处理脚本的一半

cron 仅处理脚本的一半

脚本:

curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt) && echo $ip > ~/newIP.txt || echo WAN IP is blank: curl, latency  or internet issue
# logger -s WAN IP is blank: curl, latency  or internet issue

脚本最多运行至:

curl -s http://api.ipify.org > ~/ip.txt && [[ -s ~/ip.txt ]] && ip=$(cat ip.txt)

另一部分被忽略,但是当我从终端手动 sh 脚本时,它可以正确执行。

我做错什么了吗?

答案1

这可能是个人喜好问题,但我个人认为这些u > v && w && x > y || z单行代码难以理解,尤其难以调试。如果它们能正常工作,那就没问题,但除此之外,在我看来,它们就是个麻烦事。

在您的情况下,错误在于ip=$(cat ip.txt)部分原因,因为 cronjobs 可能将当前工作目录设置为 $HOME,也可能没有。前面的代码… > ~/ip.txt 将文件写入您的 $HOME,但后面的代码cat ip.txt 尝试ip.txtcat启动目录的任何位置访问该文件。简单的修复方法是用 cat ip.txt替换cat ~/ip.txt

话虽如此,我建议如下:

#!/usr/bin/env bash

if ip=$(curl -s -f http://api.ipify.org); then
    echo "$ip" > ~/newIP.txt
else
    echo "WAN IP is blank: curl, latency  or internet issue"
fi

如果无法访问给定站点,则这依赖于curl返回错误退出值 (!=0)。如果不是这种情况,请将代码更改为:

ip=$(curl -s -f http://api.ipify.org);
if [ "$ip" ]; then

相关内容