在cron中if语句无法正常工作

4

I have the following code: (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”两次被记录),因此这不是权限或路径问题。但是,当作为cron作业运行时,if语句没有调用。没有“开始录音”的出现。
所以我的问题是:为什么当我手动调用脚本时if语句可以工作,但是当通过cron来完成时却不能?

1
你确定两次执行时使用的是相同的 shell 吗? - Eric Renouf
1
展示你的脚本第一行(包括shebang)并将你的cron行添加到问题中。 - Cyrus
是的。当使用bash编写脚本时,它看起来绝对像是在运行/bin/sh。 - Charles Duffy
1
@Cyrus 第一行是 "cd"... 所以。是的,你们(所有人)的建议可能是正确的 :) - Ole Albers
1
顺便提一下,当处理cron作业时,始终检查stderr是个好主意。在您的情况下,您应该已经收到了一个指出问题所在的错误消息。 - user1934428
1个回答

7

您的脚本是使用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.. :) - Prashanth Pradeep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接