2011-09-10 98 views
4

我有,我想執行每5分鐘一個cron作業:cron作業不啓動

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /scr_temp/scheduleSpider.sh 

/var/spool/cron/crontabs/root

這個cron應該執行一個shell腳本:

#!/bin/sh 
if [ ! -f "sync.txt" ]; then 
    touch "sync.txt" 
    chmod 777 /scr_temp 
    curl someLink 
fi 

這從命令行工作正常,但不是從cron。然而,cron本身就是startet,但腳本無法啓動。

我看過關於路徑問題,但我真的不明白它。我設置了一個將某些env數據寫入文件的cron。這是輸出:

HOME=/root 
LOGNAME=root 
PATH=/usr/bin:/bin 
SHELL=/bin/sh 

如果我執行命令行env命令我獲得以下的PATH

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

我有什麼路徑在我的shell腳本來設置輸出?

+1

看起來這實際上只會做一次事情,除非你刪除'sync.txt'。 –

+0

這屬於超級用戶,不在這裏。 –

+0

我不確定 - 它是關於使程序運行。 –

回答

3

你的$PATH是好的;不要管它。在Ubuntu上,您調用的所有命令(touch,chmod,curl)位於/bin和/或/usr/bin

你是如何設置cron工作的?你是否以root身份運行crontab some-file

看起來/etc/crontab是以root身份運行cron命令的常用機制。在我的Ubuntu系統上,sudo crontab -lno crontab for root。以root用戶身份運行crontab應該沒問題,但您可以考慮使用/etc/crontab代替。需要注意的是它使用了不同的語法比普通的crontab,如在/etc/crontab頂部的意見解釋說:

$ head -5 /etc/crontab 
# /etc/crontab: system-wide crontab 
# Unlike any other crontab you don't have to run the `crontab' 
# command to install the new version when you edit this file 
# and files in /etc/cron.d. These files also have username fields, 
# that none of the other crontabs do. 

運行sudo crontab -l。它顯示你的命令嗎?

暫時修改您的腳本,使其始終產生一些可見的輸出。例如,添加下列權利#!/bin/sh後:

echo "Running scheduleSpider.sh at \`date\`" >> /tmp/scheduleSpider.sh.log 

,看到幾分鐘後什麼在/tmp/scheduleSpider.sh.log。 (您可以將命令設置爲每分鐘運行一次,因此您不必等待結果就可以等待。)如果這樣做有效(它應該),您可以將更多echo命令添加到腳本中以詳細瞭解它正在執行的操作。

它看起來像你的腳本只能運行一次;它將創建sync.txt文件以防止它再次運行。這可能是你的問題的根源。你的意圖是什麼?你是否在運行命令後刪除sync.txt,然後忘了這麼做?

root的Ubuntu主目錄是/root。腳本第一次運行時,它應該創建/root/sync.txt。該文件是否存在?如果是這樣,它幾歲?

請注意,curl someLink(假設someLink是一個有效的URL)只會將指定鏈接的內容轉儲到標準輸出。是你的意圖(它會顯示爲電子郵件root?還是你只是沒有告訴我們整個命令?

+0

好吧,當我在腳本的頂部放置一個回顯時,我收到一封帶有輸出的電子郵件,所以這似乎起作用,但爲什麼touch和curl不起作用? –

+0

嘗試我建議的其他事情。如果通過電子郵件得到'echo'的輸出,那麼你忽略了我的建議,將輸出重定向到'/ tmp'中的文件。正如您向我們展示的那樣,您的cron工作只能運行一次。 'touch'和'curl'應該可以正常工作;你只是沒有援引他們。 –

+0

我檢查是否存在sync.txt,現在它不應該執行,並且應該執行if塊中的代碼,應該創建同步但它不應該,應該執行的curl命令啓動一個spider,在完成後刪除同步文件另一個蜘蛛可以啓動,我這樣做是爲了確保一次只有一個蜘蛛是活動的,這從命令行工作正常。我嘗試了你的echo命令,但它似乎是無效的,有一個「丟失的地方? –

2

第一:你可以用*/5(見男子5 crontab中) 第二代第一場:有cron的郵件輸出到您的電子郵件地址,通過在crontab進入[email protected]。如果腳本有任何輸出,它將被郵寄。取而代之的是,您可能有一個本地郵箱,您可以在其中找到cron輸出(通常爲$ MAIL)。

1

你科雷更好的語法是

*/5 * * * * /scr_temp/scheduleSpider.sh 

另外,檢查你scheduleSpider.sh文件的權限。 Cron在不同的用戶下運行,而不是你可能交互執行程序的用戶,所以可能是cron沒有權限。現在試試chmod 777,只是爲了檢查。

+0

已經做到了這一點,仍然有問題 –

+0

@Codemwnci:不,cron作業與執行'crontab'命令的用戶在同一個帳戶下運行。 cron守護進程本身以root身份運行,但它在調用命令時切換到相應的用戶帳戶。確實是 –

+0

。我習慣於企業環境,其中crontab是由與在命令行上運行命令的用戶不同的用戶創建的。然而,再次閱讀這個問題,我懷疑你是對的,用戶可能是一樣的。 – Codemwnci

0

您是否通過crontab -e添加了命令或僅通過編輯crontab文件?您應該使用crontab -e以正確更新它。

1

我建議:

  • 檢查/scr_temp/scheduleSpider.sh具有可執行位
  • 設置PATH正確的腳本中,或使用絕對路徑命令(/bin/touch而不是touch
  • 指定sync.txt文件絕對路徑(或相對腳本來計算)
+0

我必須在shell腳本中設置什麼路徑? –

+0

@ArtWorkAD:你不應該明確地設置'$ PATH'。 cron作業的默認'$ PATH'應該包含包含'touch'命令的目錄(可以是'/ bin','/ usr/bin'或兩者)。 –

+0

嗯,你可以發佈這個答案並描述一下嗎?我只是沒有得到我必須改變的東西... –

-1

設置工作目錄在cron腳本中,它可能不會執行你認爲它應該的東西。

0

您應該在腳本的絕對路徑前添加/ bin/sh的。

*/5 * * * * /bin/sh /scr_temp/scheduleSpider.sh