![bash 脚本中的管道正常工作,而同一脚本在 crontab 中失败](https://linux22.com/image/135188/bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E7%9A%84%E7%AE%A1%E9%81%93%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C%EF%BC%8C%E8%80%8C%E5%90%8C%E4%B8%80%E8%84%9A%E6%9C%AC%E5%9C%A8%20crontab%20%E4%B8%AD%E5%A4%B1%E8%B4%A5.png)
我遇到了一个奇怪的行为(对我来说)。我写了一个更大的脚本,运行良好。当我尝试从 crontab 定义的作业启动脚本时,以下几行导致了问题:
down_ubuntu14=https://cloud-images.ubuntu.com/trusty/current/
ubuntu14=trusty-server-cloudimg-amd64-disk1.img
Ubuntu14_Date_Web=$(wget -qO- $down_ubuntu14 | grep $ubuntu14 | awk '{print $8 $9}' | sed -e "s/<.*>/ /g" | cut -d">" -f2 | awk '{print $2}')
在最后一行中,我删除了下载网站以获取特定下载目标的日期。
soi 5076 5075 0 09:35 ? 00:00:00 wget -qO- https://cloud-images.ubuntu.com/trusty/current/
soi 5077 5075 0 09:35 ? 00:00:00 grep trusty-server-cloudimg-amd64-disk1.img
soi 5078 5075 0 09:35 ? 00:00:00 awk {print $8 $9}
soi 5079 5075 0 09:35 ? 00:00:00 sed -e s/<.*>/ /g
soi 5080 5075 0 09:35 ? 00:00:00 cut -d> -f2
soi 5081 5075 0 09:35 ? 00:00:00 awk {print $2}
看起来管道正在导致换行或将字符串的每个部分启动到单个进程中。
非常感谢您的回答和建议:我尝试举一个更精确的例子。
如果我设置一个像这样的简短脚本:
down_ubuntu14=https://cloud-images.ubuntu.com/trusty/current/
ubuntu14=trusty-server-cloudimg-amd64-disk1.img
Ubuntu14_Date_Web=$(wget -qO- $down_ubuntu14 | grep $ubuntu14 | awk '{print $8 $9}' | sed -e "s/<.*>/ /g" | cut -d">" -f2 | awk '{print $2}')
echo $Ubuntu14_Date_Web | tee /tmp/test
echo "Just another test line" | tee -a /tmp/test
并从 ssh 控制台启动它,我在测试文件中看到以下内容:
cat /tmp/test
14-Jun-2018
Just another test line
在 crontab 中我输入以下行:
20 6 * * * /home/soi/scripts/test.sh
现在脚本正在由 cron 启动,我可以在进程列表中看到以下内容:
soi 6508 6507 0 06:20 ? 00:00:00 /bin/sh -c /home/soi/scripts/test.sh
soi 6509 6508 0 06:20 ? 00:00:00 wget -qO- https://cloud-images.ubuntu.com/trusty/current/
soi 6510 6508 0 06:20 ? 00:00:00 grep trusty-server-cloudimg-amd64-disk1.img
soi 6511 6508 0 06:20 ? 00:00:00 awk {print $8 $9}
soi 6512 6508 0 06:20 ? 00:00:00 sed -e s/<.*>/ /g
soi 6513 6508 0 06:20 ? 00:00:00 cut -d> -f2
soi 6514 6508 0 06:20 ? 00:00:00 awk {print $2}
...并且仅将一个空格写入日志文件 /tmp/test 仅将以下内容写入日志:
cat /tmp/test
Just another test line
我不明白这个问题的主要原因。希望有人能在这里带来一些启发。
答案1
大多数 cron 实现不会启动一个包含进程的 shell,而是使用一个 shell 来解析管道并分别运行两个进程。如果将命令添加到 script.sh 并从 cron 调用它,它将起作用。
答案2
至少它似乎是 Linux 安装中特定的东西。我已经在五种不同的机器和 Linux 版本上尝试过该脚本,并且在任何地方都运行良好。所以我们决定重新安装盒子。
非常感谢您的支持和想法。非常感谢。
干杯,弗兰基