2010-06-08 159 views
2

我有一个脚本,我试图从cron运行。当我从bash运行它时,它工作得很好。然而,当我让的cron做的事情,我得到一个:运行一个命令作为cron会,但从命令行

myscript.sh: line 122: syntax error: unexpected end of file

我要的是运行一个命令,如果它是一个cron作业的方式,但这样做在我的壳。

作为一个方面说明:有没有人知道在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问题。卫生署!

+1

它是否真的在开始时拥有#1而不仅仅是# – eemz 2010-06-08 15:39:24

+0

(或更好地说,'#!':-) – psmears 2010-06-08 15:41:02

+0

@joefis:糟糕。 :( – BCS 2010-06-08 15:47:06

回答

1

它可能有许多事情 - 输出将被重定向到其他地方;环境变量几乎肯定会有所不同,等等。根据您提供的信息,它可能与bash和/ bin/sh(在某些系统上(包括Linux的Debian/Ubuntu风格)的不同之处)有所不同,支持稍微不同的语法)。 Cron通常会运行你使用/ bin/sh给它的命令。

尝试运行:

/bin/sh -c '<command>' 

其中<command>来自你的crontab。 (当然,如果该命令使用''引号,您将需要相应地修改它...)

+0

好点,但在我的情况下使用'#!',脚本应该总是在'/ bin/sh'下运行,并且恰好是'/ bin/bash'的符号链接......(错误在里面一个脚本文件,cron运行,所以我有理由相信,错误不是crontab中的命令行) – BCS 2010-06-08 15:52:03

+0

我更加认为crontab中的实际行本身可能有语法问题(您不指定是否crontab只是名称,或者是否有任何参数/管道/重定向等在crontab中)。但是,如果'/ bin/sh'被链接到'/ bin/bash',那么它的可能性要小得多。 (尽管它仍然值得一试,因为bash的行为不同,如果它被调用为'sh' ...)。如果crontab只有脚本的路径,没有参数,那么它一定是别的:-) – psmears 2010-06-08 16:00:56

+0

对于一些bazare原因...'/ bin/sh -c'从命令行得到错误.. 。 – BCS 2010-06-08 17:01:52

2

你的crontab中可能有一个“%”。 您必须将其转义(使用“\”)或将其更改为换行符。

+0

好点,它不是%,但是如果cron在解析该行之后可能会出现一个转义问题 – Joshua 2010-06-08 16:46:39

5

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

我猜想你试图运行的一些命令不在路径上,因此它应该创建的文件是空的,试图读取该文件的命令给你这个错误信息。

+1

调查的一种方法是运行一个只包含“echo $ PATH“,然后用该PATH值创建一个交互式会话,尝试在那里运行脚本并查看会发生什么。 – eemz 2010-06-08 16:23:00