以cron的身份运行命令,但是从命令行运行

时间:2010-06-08 15:35:26

标签: command-line cron

我有一个脚本,我正试图从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

有了这个,我可以运行任意命令,延迟不超过一秒。

(是的,我知道其中涉及各种安全问题)

问题是fiif问题。卫生署!

3 个答案:

答案 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。 (当然,如果该命令使用''引号,则需要相应地修改它...)