热门标签 | 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

推荐阅读
  • Python 工具推荐 | PyHubWeekly 第二十一期:提升命令行体验的五大工具
    本期 PyHubWeekly 为大家精选了 GitHub 上五个优秀的 Python 工具,涵盖金融数据可视化、终端美化、国际化支持、图像增强和远程 Shell 环境配置。欢迎关注并参与项目。 ... [详细]
  • 本文深入探讨了 PHP 实现计划任务的方法,包括其原理、具体实现方式以及在不同操作系统中的应用。通过详细示例和代码片段,帮助开发者理解和掌握如何高效地设置和管理定时任务。 ... [详细]
  • 本文探讨了在QT框架中如何有效遍历文件内容,并解决了一个常见的错误,即文件内容读取为空时弹窗无法正常显示的问题。 ... [详细]
  • 本文详细介绍了 Python 中的 with 语句及其背后的上下文管理器机制,从基本概念入手,通过具体示例和原理分析,帮助读者深入理解这一重要的资源管理工具。 ... [详细]
  • 本文探讨了如何利用Python处理来自不同来源的脚本输入,包括命令行参数、文件重定向和管道输出。 ... [详细]
  • 解决VSCode中文乱码问题的综合方案
    在使用VSCode进行开发时,尤其是涉及Python编程,可能会遇到中文乱码的问题。本文总结了多种有效的解决方案,帮助开发者快速解决这一常见问题。 ... [详细]
  • Git支持通过自定义钩子来扩展其功能,这些钩子根据触发条件的不同,可以分为客户端和服务器端两种类型。客户端钩子通常与本地操作相关联,如提交代码或合并分支;而服务器端钩子则与远程仓库的交互有关。 ... [详细]
  • 本文详细介绍Linux中的cut命令,包括其基本功能、参数使用方法及应用场景。cut命令允许用户从文件中提取特定列或字符,支持多种分隔符。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 深入解析RDMA中的队列对(Queue Pair)
    本文将详细探讨RDMA架构中的关键组件——队列对(Queue Pair,简称QP),包括其基本概念、硬件与软件实现、QPC的作用、QPN的分配机制以及用户接口和状态机。通过这些内容,读者可以更全面地理解QP在RDMA通信中的重要性和工作原理。 ... [详细]
  • 本文详细探讨了Java命令行参数的概念、使用方法及在实际编程中的应用,包括如何通过命令行传递参数给Java程序,以及如何在Java程序中解析这些参数。 ... [详细]
  • 深入解析:OpenShift Origin环境下的Kubernetes Spark Operator
    本文探讨了如何在OpenShift Origin平台上利用Kubernetes Spark Operator来管理和部署Apache Spark集群与应用。作为Radanalytics.io项目的一部分,这一开源工具为大数据处理提供了强大的支持。 ... [详细]
  • Python编码入门指南
    本文探讨了使用Python进行网络设备连通性测试的简便性,特别是针对IP地址范围为192.168.0.101至192.168.0.200的设备。通过比较Python与Shell、Java等语言,展示了Python在执行此类任务时的优势。 ... [详细]
  • 本文探讨了在Unix/Linux环境下,如何有效地管理和运行长期或无限期运行的Python进程。文章不仅提供了关于进程崩溃后的处理方法,还讨论了使用Cron和Inetd等工具来优化进程管理的策略。 ... [详细]
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社区 版权所有