[英]Why isn't my crontab executing bash properly?
I am a total noob to Linux and am using Raspbian on a Raspberry Pi 4. I created a bash script which updates an HTML file and runs some python programs to tweet a random article from Wikipedia's List of Unusual Articles. 這是我正在運行的 bash 腳本:
#! /bin/bash
wget -q en.wikipedia.org/wiki/Wikipedia:Unusual_articles -O Wikipedia:Unusual_articles
python3 parser.py
python3 tweeter.py
在我的 crontab 中,我有這個命令在每天下午 12 點運行 bash 腳本:
0 12 * * * /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh
當我使用bash
手動運行腳本時,它工作得很好,但我不明白為什么我的 cron 不工作。 即使我設置MAILTO=my@email.com
它也不會給我發電子郵件。
編輯:我運行echo $PATH
並添加了輸出到我的 cron 的內容。 這是 cron 現在的樣子(出於調試目的,我讓它每 2 分鍾運行一次):
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
MAILTO=my@email.com
*/2 * * * * bash /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh
這就是 bash 腳本現在的樣子:
#! /bin/bash
wget -q en.wikipedia.org/wiki/Wikipedia:Unusual_articles -O Wikipedia:Unusual_articles
python3 parser.py
python3 tweeter.py
cron 作業以用戶的主目錄作為其工作目錄運行。 這意味着所有未指定顯式路徑(或通過類似$PATH
的方式使用查找)的文件引用都將位於您的主目錄中。
指定腳本的路徑根本不會改變這一點。 我懷疑當您以交互方式測試腳本時,您會執行以下操作:
cd /home/pi/Code/Python/TwitterBots/UArticleBot
./TweetRandom.sh
嘗試這樣做,看看它做了什么:
cd ~
/home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh
我的猜測是它會做與從 cron 作業運行時相同的事情:在你的主目錄中創建一個Wikipedia:Unusual_articles
文件,然后因為找不到parser.py
或tweeter.py
腳本而出現錯誤。
解決此問題的一種方法是對所有內容使用顯式路徑(這可能還涉及修改 python 腳本,因為它們可能假定 Wikipedia 文件位於當前目錄中)。
另一種選擇是在執行任何其他操作之前讓您的腳本cd
到它自己的目錄。 一般來說,這可能有點棘手(請參閱BashFAQ #28 ),但這應該適用於您的情況:
#!/bin/bash
cd "$(dirname "$BASH_SOURCE")" || {
echo "Error cd'ing to script directory" >&2
exit 1
}
... rest of script here
順便說一句,在對 cron 作業進行故障排除時,捕獲它們在運行時打印的錯誤和其他信息非常有用。 cron 會嘗試為您解決這個問題,但它並不總是能很好地工作。 您可以通過將這樣的重定向添加到 cron 條目的末尾來將 output 定向到日志文件:
0 12 * * * /home/pi/Code/Python/TwitterBots/UArticleBot/TweetRandom.sh >>/tmp/tweetjob.log 2>&1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.