热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

crontab执行失败的多种原因

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

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

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

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

crontab中包含非法字符

比如这个命令:

echo `date +%Y%m%d`

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

通过 man 5 crontab 查看到该问题的说明, 如下图:
《crontab执行失败的多种原因》

解决方法也很简单:

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

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

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

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

这很好理解, /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

推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
author-avatar
truelee的一些事一些情
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有