CentOS下crontab的定時任務不能執行 行 x :xxxx:未找到命令


問題:scrapy爬蟲在win本地和在linux的非root用戶下都能夠使用scrapy crawl crawlername,並且能夠成功爬取,但是在linux中,使用crongtab -e 添加定時任務后,總是會在日志中報錯:/home/apps/start_ratespider.sh:行5: scrapy: 未找到命令

crontab 的環境變量和我們的賬號都不一樣, 和 root 的環境變量也不一樣.
類似普通用戶會先加載 ~/.bashrc 或者 /etc/profile, crontab 則會在運行時加載 /etc/crontab 導入其環境變量.
因此不妨看看 scrapy 這條命令是否被加入了 crontab 的運行環境變量里: /etc/crontab .

其實最簡單的辦法, 是在 crontab 里執行定時任務時, 盡量用絕對路徑:

# 執行命令的腳本
cd /apps/jr_n/ratespider
#scrapy crawl ratecast
/usr/local/bin/scrapy crawl ratecast

如果不知道 scrapy 這條命令被放在哪里了, 可以執行如下兩條命令來找到這個路徑:

whereis scrapy
# 或者
which scrapy

現在來看看crontab的環境變量文件 /etc/contab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

PATH路徑中只有四個:/sbin:/bin:/usr/sbin:/usr/bin

我在爬蟲程序中的谷歌瀏覽器驅動 chromedriver由於放在了 /usr/local/bin下,如果在爬蟲中不指定驅動地址,比如以下:

 

    def __init__(self):
        # 在初始化頁面對象時,創建driver
        super(RatecastSpider, self).__init__(name='rate')
        # 使用火狐瀏覽器
        # option = webdriver.FirefoxOptions()
        # 使用谷歌瀏覽器
        option = webdriver.ChromeOptions()
        # root用戶也可以啟動,谷歌瀏覽器默認root用戶不能啟動
        option.add_argument("--no-sandbox")
        option.add_argument("--headless")
        # option.headless = True

        # 使用火狐瀏覽器
        # self.driver = webdriver.Firefox(options=option)
        # self.driver = webdriver.Firefox(options=option, executable_path="C:\Log\geckodriver.exe")
        # sit的linux環境
        # self.driver = webdriver.Firefox(options=option, executable_path=r"/usr/local/bin/chromedriver")
        # self.driver = webdriver.Firefox(options=option, executable_path="/home/lzq/driver/firefox/dr/geckodriver")
        # 使用谷歌瀏覽器
        self.driver = webdriver.Chrome(options=option)
        # 指定驅動地址,win地址
        # self.driver = webdriver.Chrome(options=option,executable_path="C:\Python27\Scripts\chromedriver.exe")
        # linux地址
        # self.driver = webdriver.Chrome(options=option, executable_path="\usr\local\bin\chromedriver")

        #如果需要指定驅動地址
        # self.driver = webdriver.Firefox(options=option, executable_path="")

        #添加隨機ua
        # ua = UserAgent()
        # self.headers = {
        #     "User-Agent":ua.random,
        # }

會報錯:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.  就是因為crontab的環境變量中沒有這個路徑。

解決方法:在代碼中指定chromedriver的絕對路徑

self.driver = webdriver.Chrome(options=option, executable_path="\usr\local\bin\chromedriver")


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM