2008-10-01 107 views
8

的Cron安裝了vixie-cron的bash腳本從殼運行,而不是從cron作業

/etc/cron.daily/rmspam.cron

#!/bin/bash 
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*; 

我有我想要添加到cron作業這個簡單的bash腳本(也包括垃圾郵件學習命令之前),但這部分總是失敗,「文件或目錄未找到」從我所看到的是,當作爲cron作業運行時,metachar未被正確插入。如果我從命令行執行腳本,它工作正常。

我想一個爲什麼這不工作,當然是一個可行的解決方案:)

感謝

編輯#1 回來這個問題時,我得到普及問題徽章吧。我第一次這樣做,

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm 

,最近剛通過xargs的手冊頁讀,把它改成這個

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm 

短xargs的選項是-r

+0

請編輯並添加你的crontab中的行。 – 2008-10-01 12:38:33

+0

他在下面的評論中提到它位於/etc/cron.daily – 2008-10-01 12:42:14

回答

14

如果目錄中沒有文件,則通配符將不會被展開並直接傳遞給命令。沒有名爲「*」的文件,然後命令失敗,並顯示「未找到文件或目錄」。試試這個:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then 
    rm /home/user/Maildir/.SPAM/cur/* 
fi 

或者只是使用「-f」標誌rm。該命令的另一個問題是當命令行的最大長度存在太多垃圾郵件時發生的情況。像這樣的東西可能是更好的整體:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' + 

如果你有一箇舊的發現只有高層RM一個文件上的時間:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm 

,處理過多的文件以及任何文件。感謝Charles Duffy指出+選項在find中執行。

0

你指定的完整路徑到cronjob中的腳本?

00 3 * * * /home/me/myscript.sh 

而不是

00 3 * * * myscript.sh 

在另一方面,這是對所有的Linux機器我有機會獲得/斌/ RM。你有沒有在你的機器上仔細檢查它確實是/usr/bin/rm

+0

該腳本位於/etc/cron.daily/,它位於/ etc/crontab – Tanj 2008-10-01 12:34:59

0

嘗試添加

[email protected] 

到你的cron文件的頂部,你應該得到郵寄給您的任何輸入/錯誤。

也可以考慮添加命令作爲一個cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/* 
0

嘗試使用強制選項,而忘記了添加路徑rm命令。我認爲它不應該需要...

rm -f 

這將確保即使目錄中沒有文件,rm命令也不會失敗。如果這是一個shell腳本的一部分,*應該工作。它在我看來你可能有一個空的目錄...

我明白腳本的其餘部分正在執行,對不對?

0

rm確實位於您的系統上的/usr/bin/?我一直認爲rm應該居住在/bin/