我有一个脚本,我正试图从cron运行。当我从bash运行它时,它工作得很好。但是当我让cron做的时候,我得到了一个:
myscript.sh:第122行:语法错误:意外的文件结尾
我想要的是一种运行命令的方法,就像它是一个cron作业一样,但是在我的shell中执行它。
作为旁注:有谁知道在cron下会有什么不同? (该脚本已有#!/bin/sh
行)
回答我自己的问题:我把它添加到我的crontab:
* * * * * bcs for ((i=$(date +\%M); i==$(date +\%M) ;)) ; do find ~/.crontemp/ -name '*.run' -exec "{}" ";" ; sleep 1; done`
并创建了这个脚本:
#!/bin/sh
tmp=$(mktemp ~/.crontemp/cron.XXXXX)
mknod $tmp.pipe p
mv $tmp $tmp.pre
echo $* '>' $tmp.pipe '1>&2' >> $tmp.pre
echo rm $tmp.run >> $tmp.pre
chmod 700 $tmp.pre
mv $tmp.pre $tmp.run
cat $tmp.pipe
rm $tmp.pipe
有了这个,我可以运行任意命令,延迟不超过一秒。
(是的,我知道其中涉及各种安全问题)
问题是fi
与if
问题。卫生署!
答案 0 :(得分:5)
当脚本以交互方式工作并且在cron中失败时,它几乎总是一个PATH问题。 cron作业进程中的默认PATH比交互式会话中的短得多。典型的结果是您尝试运行的某个系统实用程序出现“未找到”错误,而该错误不在cron中的PATH上。
我猜你试图运行的某个命令不在路径上,因此它应该创建的文件是空的,并且试图读取该文件的命令会给你这个错误信息。
答案 1 :(得分:2)
您的crontab中可能有“%”。 您必须将其转义(使用“\”),或者在换行符中更改它。
答案 2 :(得分:1)
可能有很多事情 - 输出会被重定向到其他地方;环境变量几乎肯定会有所不同等等。关于你给出的信息,它可能与bash和/ bin / sh之间的区别有关(在某些系统上 - 包括Linux的Debian / Ubuntu风格 - 是不同的,以及支持略有不同的语法)。 Cron通常会使用/ bin / sh运行你给它的命令。
尝试跑步:
/bin/sh -c '<command>'
<command>
来自您的crontab。 (当然,如果该命令使用''
引号,则需要相应地修改它...)