目录

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程序时就遇到如下报错:

selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH.

产生该问题的本质原因是:crontab任务在执行时所能读取到环境变量与用户登录后所读取到到的环境变量是不同的。

用户登录shell后所能读取到的环境变量通常定义在如下几个地方:~/.bashrc/etc/profile,而crontab定时任务所能读取到的环境变量是定义在 /etc/crontab中的。

如下是我的Linux主机的/etc/crontab内容:

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命令所在的路径。

[root@test ~]# whereis chromedriver
chromedriver: /usr/local/bin/chromedriver

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

解决办法如下:

办法一:

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

[root@test ~]# mv /usr/local/bin/chromedriver /usr/bin/
[root@test ~]# whereis chromedriver
chromedriver: /usr/bin/chromedriver

办法二:

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

# 先加载环境变量
export PATH=$PATH:/usr/local/bin/chromedriver
# 再执行命令
...

办法三:

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

[root@test ~]# crontab -l
5 0 * * * source /etc/profile && /root/task/test.sh

脚本缺少执行权限

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

[root@test task]# ls -l
-rw-r--r-- 1 root root 96 Jul 28 17:12 task_test.sh

此时表现出的现象就是脚本没有按照设置的定时参数执行,看起来就像是定时参数设置不正确似的。

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

[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 定时任务

crontab采坑总结的更多相关文章

  1. Cloudera Manager 5.9 和 CDH 5.9 离线安装指南及个人采坑填坑记

    公司的CDH早就装好了,一直想自己装一个玩玩,最近组了台电脑,笔记本就淘汰下来了,加上之前的,一共3台,就在X宝上买了CPU和内存升级了下笔记本,就自己组了个集群. 话说,好想去捡垃圾,捡台8核16线 ...

  2. angular采坑记录

    在angular中会遇到一些莫名的问题,导致不能完成想要的功能,可能是某项用法使用错误,或许是angular相对应不支持,或者是我们功力根本就没有达到.为了在每次采坑之后能有所收获,再遇到时能理解其根 ...

  3. 分布式改造剧集之Redis缓存采坑记

    Redis缓存采坑记 ​ 前言 ​ 这个其实应该属于分布式改造剧集中的一集(第一集见前面博客:http://www.cnblogs.com/Kidezyq/p/8748961.html),本来按照顺序 ...

  4. 关于定时脚本crontab的坑

    需求: 每分钟执行一次程序,将处理后的数据写入mongodb 最初做法: 1):写crontab没有响应,于是打算通过shell脚本的while true来执行 当时sb,没控制时间内,而且我还是用n ...

  5. 采坑:python base64

    需求:  读取文本内容,对字符串进行base64加密 >>> str = 'aaaaaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbbbbbbbbbbbbb\nccc ...

  6. Hadoop环境搭建--Docker完全分布式部署Hadoop环境(菜鸟采坑吐血整理)

    系统:Centos 7,内核版本3.10 本文介绍如何从0利用Docker搭建Hadoop环境,制作的镜像文件已经分享,也可以直接使用制作好的镜像文件. 一.宿主机准备工作 0.宿主机(Centos7 ...

  7. Spring Cloud Config采坑记

    1. Spring Cloud Config采坑记 1.1. 问题 在本地运行没问题,本地客户端服务能连上本地服务端服务,可一旦上线,发现本地连不上线上的服务 服务端添加security登录加密,客户 ...

  8. rabbitmq在ios中实战采坑

    1. rabbitmq在ios中实战采坑 1.1. 问题 ios使用rabbitmq连接,没过多久就断开,并报错.且用android做相同的步骤并不会报错,错误如下 Received connecti ...

  9. 从源码看Spring Security之采坑笔记(Spring Boot篇)

    一:唠嗑 鼓捣了两天的Spring Security,踩了不少坑.如果你在学Spring Security,恰好又是使用的Spring Boot,那么给我点个赞吧!这篇博客将会让你了解Spring S ...

  10. Charles 抓包工具安装和采坑记录

    Charles 抓包工具安装和采坑记录 网络抓包是解决网络问题的第一步,也是网络分析的基础.网络出现问题,第一步肯定是通过抓包工具进行路径分析,看哪一步出现异常.做网络爬虫,第一步就是通过抓包工具对目 ...

随机推荐

  1. [转帖]LVS入门篇(三)之LVS的工作模式和调度算法

    LVS入门篇(三)之LVS的工作模式和调度算法 https://www.cnblogs.com/linuxk/p/9358512.html 1.NAT模型 (1)原理图: ①.客户端(200.10.1 ...

  2. K3S +Helm+NFS最小化测试安装部署只需十分钟

    作者:郝建伟 k3s 简介 官方文档:k3s 什么是k3s k3s 是一个轻量级的 Kubernetes 发行版 它针对边缘计算.物联网等场景进行了高度优化. k3s 有以下增强功能: 打包为单个二进 ...

  3. 【VictoriaMetrics】一个小优化:循环改查表,性能提升56.48 倍

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 做了一个 vm-storage 数据文件 merge 的工 ...

  4. Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题

    目录 一.定义表模型时区问题 1.1 time.Time 与int64 1.2 优势 二.unique唯一索引字段数据冲突问题 一.定义表模型时区问题 1.1 time.Time 与int64 一般情 ...

  5. 【JVM】运行时内存分配

    程序计数器 用于标识线程执行到了字节码文件(class文件)的哪一行,当执行native方法时,值为undefined,各个线程私有 Java虚拟机栈 每个线程独有,每个方法执行时会创建一个栈帧,用于 ...

  6. 超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据

    "超级AI助手:全新提升!中文NLP训练框架,快速上手,海量训练数据,ChatGLM-v2.中文Bloom.Dolly_v2_3b助您实现更智能的应用!" 1.简介 目标:基于py ...

  7. 全网最详细超长python学习笔记、14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了!

    相关文章: 全网最详细超长python学习笔记.14章节知识点很全面十分详细,快速入门,只用看这一篇你就学会了! [1]windows系统如何安装后缀是whl的python库 [2]超级详细Pytho ...

  8. 3.0 熟悉IDAPro静态反汇编器

    IDA Pro 是一种功能强大且灵活的反汇编工具,可以在许多领域中发挥作用,例如漏洞研究.逆向工程.安全审计和软件开发等,被许多安全专家和软件开发者用于逆向工程和分析二进制代码.它支持大量的二进制文件 ...

  9. Tomcat8安装手记

    Tomcat安装虽然简单,稍不注意,就会坠入万丈深渊,记录痛苦的安装经历. 首先先介绍一下安装条件和正确的安装方式. 安装条件 系统已经安装jdk(前提) tomcat8压缩包 (可以去官网下载 或者 ...

  10. libuv计时器

    目录 1.uv_timer_t - 计时器句柄 2.API 2.1.uv_timer_init 2.2.uv_timer_start 2.3.uv_timer_stop 2.4.uv_timer_ag ...