zoukankan      html  css  js  c++  java
  • 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")
  • 相关阅读:
    数据分析三剑客之pandas
    python神器 Jupyter Notbook
    数据分析三剑客之numpy
    MySQL之数据备份与还原
    爬虫之增量式爬虫
    文件相关命令(find,tree,tar)文件属性信息 date
    系统通配符号、系统正则符号,grep
    sed命令
    系统用户权限,系统权限位,用户相关命令
    根下目录及目录内详细文件
  • 原文地址:https://www.cnblogs.com/yoyowin/p/12065932.html
Copyright © 2011-2022 走看看