2010-06-08 156 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