2014-02-14 114 views
1

當我使用這個:如果其他語句在crontab中工作錯誤?

*/5 6-18 * * 1-6 [ "$(ls -A /DIR_WHERE_FILES_ARE_OR_NOT/)" ] && 
    rsync -au /DIR_WHERE_FILES_ARE_OR_NOT/ /DIR_WHERE_FILES_SHOLD_GO; \ 
    mv /DIR_WHERE_FILES_ARE_OR_NOT/* /SAVE_DIR/ || 
    mail -s "DIR IS EMPTY" [email protected] <<< "message" 

我得到兩個郵件:

MV:不能STAT`/ DIR_WHERE_FILES_ARE_OR_NOT/*「:沒有這樣的文件或 目錄

「DIR IS EMPTY」

爲什麼?

+2

怎麼樣有這些條件合適的劇本,並從crontab中調用?像這樣,跟蹤和維護非常複雜。 – fedorqui

+0

謝謝! :)現在我已經改變了兩個命令到{}但它不幫助 – user3310114

+0

只有當我的廣告 退出0; 後面的兩個表彰,我doent得到任何錯誤的郵件但是當文件在DIR我得到一個錯誤信息: /bin/sh:-c:line 0:語法錯誤附近意外的令牌'}' – user3310114

回答

2

你得到

mv: cannot stat `/DIR_WHERE_FILES_ARE_OR_NOT/*': No such file or directory 

整整陳述的理由:該目錄是空的,所以它不包含名爲*(星號)文件。這只是glob在shell中的工作方式:如果glob不匹配任何內容,它會直接傳遞給命令。由於mv試圖重命名一個不存在的文件,因此如圖所示抱怨。

這都將是更可讀的,如果不是的&&||運營商在一個crontab的順序,你會放在整個邏輯在腳本中具有同等if/else/fi結構並調用從cron腳本。

您收到兩封郵件是因爲您明確發送了第一封電子郵件與mail -s。第二個來自cron,因爲stderr和stdout的輸出不是空的。

你的命令同

if [ "$(ls ...)" ]; then 
    rsync 
fi 
if ! mv; then 
    mail 
fi 

注意,沒有else

+0

但爲什麼crontab不只是if語句或else語句? – user3310114

+1

由於'&&'與'||'的優先權。 – Jens

+0

澄清,因爲與分號結合的短路語義。在shell語法中,分號使這兩個獨立的*和 - 或列表*。在第二個列表中,'mv || mail',兩者都運行,因爲'mv'失敗。 – Jens

1

您收到兩封郵件,因爲當mv失敗時,cron捕獲寫入標準錯誤的內容並將其郵寄給所有者,然後運行mail命令。您可以從mv中排除錯誤消息,以避免來自cron的郵件。

mv /DIR_WHERE_FILES_ARE_OR_NOT/* /SAVE_DIR/ 2> /dev/null || mail -s "DIR IS EMPTY" [email protected] <<< "message" 
+0

當'mv'失敗時,'mv'寫入stderr,而不是'cron'。 – Jens

+0

我知道我的措辭很差,但沒有意識到只有*如何*糟糕。 – chepner

0

就像用戶的Jens已經說過了,也從我的經驗,除非您使用的是非常簡單的,通常單個命令,你應該堅持腳本文件。所以,就你而言,我會用腳本文件去。我會給你一個例子。

#!/bin/bash 

dir_where_files_are_or_not=/filespath 
dir_where_files_should_go=/another/filespath 
save_dir=/savefiles/path 

# ok, lets start by checking if dir contains files 
if [ "$(ls -A $dir_where_files_are_or_not)" ]; then 
    # dir contains files, so lets rsync and mv them 
    rsync -au $dir_where_files_are_or_not/ $dir_where_files_should_go 
    mv $dir_where_files_are_or_not/* $save_dir 
else 
    # dir is empty, lets send email 
    mail -s "DIR IS EMPTY" [email protected] <<< "message" 
fi 

現在,我只是把這段代碼放在一個文件中。給它一個名稱,例如「chkfiles」並將其保存在一個目錄中(我使用/ usr/local/sbin來存放所有腳本)。

接下來,在shell中運行命令chmod +x /usr/local/sbin/chkfiles以使文件可執行。然後將腳本添加到您的crontab。

我建議裏面的crontab下面一行:

*/5 6-18 * * 1-6 /bin/bash /usr/local/sbin/chkfiles 

我用/斌/慶典呼籲該腳本正​​確解釋。它現在應該按預期工作。

重要提示:

  1. 運行腳本之前,您需要更改dir_where_files_are_or_notdir_where_files_should_gosave_dir瓦爾您的需求。
  2. 包括在迪爾斯尾隨斜槓,否則的rsync和mv可能不會做你真正想做

問候