【问题标题】:if statement not working in cronif 语句在 cron 中不起作用
【发布时间】:2016-04-25 08:31:54
【问题描述】:

我有以下代码:(record.sh)

cd $(dirname $0)

dt=$(date '+%d/%m/%Y %H:%M:%S');
echo $dt;
read action < /home/nfs/sauger/web/pi/action.txt
echo $action;
if [[ $action == *"start"* ]]
then
  echo "start recording"
  ./gone.sh
  exit 1
elif [[ $action == *"stop"* ]]
then
 echo "stop recording"
  ./gone.sh
  exit 1
else 
#More stuff done here
fi

当我手动运行此脚本时,输出如下:

19/01/2016 19:07:11
start
start recording

如果通过(根)cronjob 运行相同的脚本,则输出如下:

19/01/2016 19:07:01
start

如您所见,“action.txt”文件已顺利读取(两次都记录了“start”),因此这不应该是权限问题或路径错误。但是当作为 cronjob 运行时,不会调用 if 语句。没有出现“开始录制”。

所以我的问题是:为什么当我手动调用脚本时 if 语句有效,但通过 cron 完成时却无效?

【问题讨论】:

  • 你确定两次都是用同一个shell执行的吗?
  • 显示脚本的第一行(带有 shebang)并将您的 cron 行添加到您的问题中。
  • 是的。当它是为 bash 编写时,这绝对看起来像一个使用 /bin/sh 运行的脚本。
  • @Cyrus 第一行是“cd”...所以。是的,你(所有人)的建议可能是对的 :)
  • 顺便说一句,在使用 cron 作业时,最好同时检查 stderr。在你的情况下,你应该已经收到了一条错误消息到 stderr,它会查明问题。

标签: linux bash shell cron raspberry-pi2


【解决方案1】:

您的脚本是为 bash 编写的;这些错误几乎肯定表明它正在使用/bin/sh 运行。

要么添加适当的 shebang 并确保以尊重它的方式调用它(/path/to/script 而不是 sh /path/to/script),要么修复它以使其兼容。例如:

case $action in
  *start*)
    echo "start recording"
    ./gone.sh
    exit 1
    ;;
  *stop*)
    echo "stop recording"
    ./gone.sh
    exit 1
    ;;
esac

【讨论】:

  • 是的,这就是问题所在......非常感谢......!我们需要添加适当的 shebang .. :)
最近更新 更多