当前位置: 首页 > news >正文

crontab执行失败的多种原因

crontab是Linux下执行定时任务的常见方法。
这里总结一下自己遇到的或者被问到的相关问题, 诸如"为什么crontab执行失败", "为什么crontab没有执行"。

在分析之前, 我们先确认一个前提: 操作命令本身的执行并没有问题, 在shell下可正常运行;
不存在权限问题, 更没有参数缺少的问题。
也即是说,使用crontab -l输出该命令时,直接复制到shell中是可以正常执行的,但是在crontab中事与愿违。

在以上的前提下,可能是如下的几个原因,导致了crontab不能正常执行。

crontab中包含非法字符

比如这个命令:

echo `date +%Y%m%d`

该命令在shell下直接执行是没问题的,但是在crontab中就有问题. 原因是crontab中不能出现非法字符%.
%字符如果没有跟在转义字符\之后,将会被当做换行符,第一个%字符之后的内容将会视为该行命令的标准输入。

通过 man 5 crontab 查看到该问题的说明, 如下图:
非法字符的说明

解决方法也很简单:

  • 既可以将命令写在另一个sh文件中,然后再来执行该文件
  • 也可以使用\符号对非法字符进行转义

/etc/crontab 与 contab -e 两种格式混淆

定时任务有两种编辑方法,一种是root用户下编辑/etc/crontab文件: vi /etc/crontab;
一种是在特定用户身份下(可能是root,可能非root),执行crontab -e 进行编辑.

前者的格式相比于后者, 多了一个表示执行命令的“用户身份”的字段.如下图:
前者的格式

这很好理解, /etc/crontab 对所有用户都是同一个文件,当然需要指明是以哪个用户来执行命令了.

echo "right" >> /tmp/output_right.txt 命令为例:
在编辑/etc/crontab时需要写成:

*/1 * * * * root echo "right" >> /tmp/output_right.txt

crontab -e的情况下则要写成:

*/1 * * * * echo "right" >> /tmp/output_right.txt


crond服务未启动

这个就太好检查了, 执行service crond status 查看该服务的运行状态.
如果进程已经dead,重启一下即可:

service crond start


标准/错误输出中包含不支持字符(比如中文)

这仅仅是一个可能的原因, 不同环境上的表现可能不一样, 跟操作系统支持的编码有关.

比如下面一段简单的python代码:

# -*- coding: utf-8 -*-
print(u'中文')

将以上代码保存为文件demo.py. 在shell中执行 python demo.py 是没问题的, 但是在crontab就可能出现问题.

总之避免在日志输出中包含中文吧。

缺少环境变量或者未使用绝对路径

环境变量在/etc/crontab 顶部的PATH中指定了。默认情况下,PATH=/sbin:/bin:/usr/sbin:/usr/bin

假设你安装了supervisorctl(一个守护进程的软件)到路径/usr/local/bin/supervisorctl, 然后定义了每天一次的定时任务:

0 1 * * * supervisorctl restart all

该定时任务并不会生效。

原因在于,PATH中并没有将/usr/local/bin加入环境变量。执行supervisorctl时找不到该文件。
解决方法有:

  • /usr/local/bin加入PATH
  • 或者使用绝对路径 0 1 * * * /usr/local/bin/supervisorctl restart all

相关文章:

  • 分布式文件系统FastDFS 集群安装
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • oracle 10g 如何用srvctl 添加数据库资源到cluster中
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • SQL Server -- T-SQL 编码标准
  • fastDFS客户端简单入门使用及接口文档
  • Python 学习笔记【10】练习:购物车程序
  • CSS3实现元素旋转
  • WebApi获取请求url主机
  • role=, .sr-only 的作用
  • Underscore 整体架构浅析
  • BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题解决方法
  • 关于AWS的备份策略
  • Objective-C三方库: ZXEasyCoding
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【mysql】环境安装、服务启动、密码设置
  • Android单元测试 - 几个重要问题
  • Angular 2 DI - IoC DI - 1
  • Cookie 在前端中的实践
  • hadoop集群管理系统搭建规划说明
  • ng6--错误信息小结(持续更新)
  • Promise面试题2实现异步串行执行
  • 产品三维模型在线预览
  • 对象引论
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 简单数学运算程序(不定期更新)
  • 首页查询功能的一次实现过程
  • 我有几个粽子,和一个故事
  • 我与Jetbrains的这些年
  • 移动端唤起键盘时取消position:fixed定位
  • 用Canvas画一棵二叉树
  • 组复制官方翻译九、Group Replication Technical Details
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (poj1.2.1)1970(筛选法模拟)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十一)c52学习之旅-动态数码管
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • **PHP分步表单提交思路(分页表单提交)
  • .form文件_SSM框架文件上传篇
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Framework .NET Core与 .NET 的区别
  • .Net IE10 _doPostBack 未定义
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • @JsonSerialize注解的使用
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [Android]RecyclerView添加HeaderView出现宽度问题
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [BZOJ4010]菜肴制作
  • [GN] Vue3.2 快速上手 ---- 核心语法2