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")

猜你喜欢

转载自www.cnblogs.com/yoyowin/p/12065932.html
今日推荐