Command line 像cron那样运行命令,但要从命令行运行

Command line 像cron那样运行命令,但要从命令行运行,command-line,cron,Command Line,Cron,我有一个脚本,我正试图从cron运行。当我从bash运行它时,它工作得很好。然而,当我让cron做这件事时,我得到了一个: myscript.sh:第122行:语法错误:文件意外结束 我想要的是一种像cron作业一样运行命令的方法,但是在我的shell中执行它 作为旁注:有人知道在cron下会有什么不同吗?(脚本已经有一行#!/bin/sh) 为了回答我自己的问题:我在crontab中添加了以下内容: * * * * * bcs for ((i=$(date +\%M);

我有一个脚本,我正试图从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
有了它,我可以以不超过1秒的延迟运行任意命令

(是的,我知道这涉及到各种各样的安全问题)

问题是一个
fi
if
的问题。啊

您的crontab中可能有一个“%”。
您必须转义它(用“\”),否则它会在换行符中更改。

当脚本以交互方式工作并且在cron中失败时,几乎总是一个路径问题。cron作业进程中的默认路径比交互式会话中的路径短得多。典型的结果是您尝试运行的某些系统实用程序出现“未找到”错误,而该系统实用程序不在cron中的路径上


我猜您尝试运行的某个命令不在路径上,因此它应该创建的文件是空的,而尝试读取该文件的命令会向您发送此错误消息。

它可能有很多功能-输出将重定向到其他位置;环境变量几乎肯定会不同,等等。根据您提供的信息,它可能与bash和/bin/sh之间的差异有关(在某些系统上,包括Linux的Debian/Ubuntu版本,它们是不同的,并且支持稍微不同的语法)。Cron通常会使用/bin/sh运行您给它的命令

尝试运行:

/bin/sh -c '<command>'
/bin/sh-c''

其中
来自您的crontab。(当然,如果该命令使用
引号,您需要相应地修改它…

它是否真的在开始时有#1,而不仅仅是#@psmears-oops,是的@BCS-我刚刚在RH 5.5上检查了一个两行脚本,不,它不关心这一点,所以这不是错误的根源。请看下面我的答案,就像我说的,这是最典型的cron问题。很好的观点,但是在我的例子中,
#
,脚本应始终在
/bin/sh
下运行,而且这恰好是指向
/bin/bash
的符号链接。。。(错误在cron运行的脚本文件中,因此我有理由相信错误不是crontab中的命令行)我更认为crontab中的实际行本身可能有语法问题(您没有指定crontab是否只有名称,或者crontab中是否有任何参数/管道/重定向等)。但是如果将
/bin/sh
符号链接到
/bin/bash
,则可能性要小得多。(尽管它仍然值得一试,因为如果将bash作为
sh
..调用,它的行为会有所不同)。如果crontab只有脚本的路径,没有参数,那么它一定是另外一个:-)通过查看
sh
手册页,您可以执行类似于
cat my_command|u script.sh | sh-s
的操作,以避免
-c
选项的引用问题。@Jason:如果您想在,您只需执行
sh my_command\u script.sh
,无需使用
cat
。然而,这里的重点是能够在不将复杂命令放入文件的情况下运行它。调查的一种方法是运行一个只包含“echo$PATH”的cron作业,然后使用该路径值创建一个交互式会话,尝试在那里运行脚本,看看会发生什么。这一点很好。这不是%的问题,但如果cron在该点之后解析该行,则可能是一个转义问题。