前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >crontab采坑总结

crontab采坑总结

作者头像
编程随笔
发布2021-08-05 10:59:50
1.1K0
发布2021-08-05 10:59:50
举报
文章被收录于专栏:后端开发随笔后端开发随笔

crontab是Linux平台实现定时任务的服务工具,通常情况下该服务会预装在发行版中,直接使用即可。

关于crontab的详细用法参考:https://man7.org/linux/man-pages/man5/crontab.5.html ,网络上也有许多博文介绍,不再赘述。

在此主要阐述在使用crontab时容易遇到的几个采坑问题: 1.crontab环境变量 2.脚本缺少执行权限

图片来源于网络
图片来源于网络

crontab环境变量

在使用crontab时遇到的环境变量问题表现为: 在shell中能正常执行的脚本,但是通过crontab任务调度时就提示命令不存在:Message: 'xxx' executable needs to be in PATH. 例如,我的shell脚本运行Selenium python程序时就遇到如下报错:

代码语言:javascript
复制
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.

产生该问题的本质原因是:crontab任务在执行时所能读取到环境变量与用户登录后所读取到到的环境变量是不同的。 用户登录shell后所能读取到的环境变量通常定义在如下几个地方:~/.bashrc/etc/profile,而crontab定时任务所能读取到的环境变量是定义在 /etc/crontab中的。 如下是我的Linux主机的/etc/crontab内容:

代码语言:javascript
复制
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

如上所示,crontab任务所能读取到的PATH变量在如下路径中:/sbin:/bin:/usr/sbin:/usr/bin 。 也就是说在crontab任务中运行的命令都需要在这些路劲下,否则就会提示路径找不到的报错信息。

如下还是以我遇到的‘chromedriver’命令找不到的问题为例进行说明:

首先,查看一下chromedriver命令所在的路径。

代码语言:javascript
复制
[root@test ~]# whereis chromedriver
chromedriver: /usr/local/bin/chromedriver

显然/usr/local/bin/chromedriver并不在/etc/crontab所定义的PATH路径中,所以找不到命令很正常。

解决办法如下:

办法一:

将chromedriver移动到/usr/bin路径下:

代码语言:javascript
复制
[root@test ~]# mv /usr/local/bin/chromedriver /usr/bin/
[root@test ~]# whereis chromedriver
chromedriver: /usr/bin/chromedriver

办法二:

在crontab任务执行的脚本中将chromedriver添加到PATH变量中

代码语言:javascript
复制
# 先加载环境变量
export PATH=$PATH:/usr/local/bin/chromedriver
# 再执行命令
...

办法三:

/usr/local/bin/chromedriver添加到/etc/profile或者~/.bashrc中,然后在crontab任务的执行命令中动态加载环境变量。

代码语言:javascript
复制
[root@test ~]# crontab -l
5 0 * * * source /etc/profile && /root/task/test.sh

脚本缺少执行权限

当脚本缺少可执行权限时,crontab任务无法调度执行。

代码语言:javascript
复制
[root@test task]# ls -l
-rw-r--r-- 1 root root  96 Jul 28 17:12 task_test.sh

此时表现出的现象就是脚本没有按照设置的定时参数执行,看起来就像是定时参数设置不正确似的。 注意: 这个问题很有迷惑性,会让人觉得是定时参数设置不正确,所以在使用crontab任务调度脚本执行时,首先要做的事情就是给脚本添加可执行权限。

代码语言:javascript
复制
[root@test task]# chmod +x task_test.sh
[root@test task]# ls -l
-rwxr-xr-x 1 root root  96 Jul 28 17:12 task_test.sh

另外,关于crontab的定时参数的设置,可以通过2个在线工具完成,非常方便: https://tool.lu/crontab https://crontab.guru/

【参考】 https://www.ibm.com/support/pages/cron-environment-and-cron-job-failures The Cron Environment and Cron Job Failures https://www.baeldung.com/linux/load-env-variables-in-cron-job How to Load Environment Variables in a Cron Job https://www.jianshu.com/p/446758d924df 【crontab】crontab 与 环境变量 https://www.cnblogs.com/zhenglisai/p/6846372.html 【linux】crontab的环境变量问题 https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/crontab.html crontab 定时任务

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • crontab是Linux平台实现定时任务的服务工具,通常情况下该服务会预装在发行版中,直接使用即可。
  • crontab环境变量
  • 脚本缺少执行权限
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档