0

0

crontab -l 显示为空但任务仍在执行的系统级 cron.d 排查

冷漠man

冷漠man

发布时间:2026-01-23 19:09:10

|

186人浏览过

|

来源于php中文网

原创

crontab -l 看不到 /etc/cron.d/ 下的任务,因其仅显示当前用户级 crontab,而 cron.d 文件由 crond 进程独立加载,需检查日志、权限、命名及语法。

crontab -l 显示为空但任务仍在执行的系统级 cron.d 排查

crontab -l 为什么看不到 cron.d 下的任务

crontab -l 只显示当前用户的用户级 crontab(即 crontab -e 编辑的文件),完全不读取系统级目录 /etc/cron.d/ 中的任务。这是设计如此,不是 bug —— 系统级任务和用户级任务走的是两套加载机制。

系统级 cron.d 文件由 crond 进程在启动时或收到 SIGHUP 时扫描加载,路径固定为:/etc/cron.d/ 下所有非隐藏、可读、权限合规(不能被组/其他写)的文件。

  • 文件名不能含点号(.)或波浪线(~),否则会被忽略
  • 必须有明确的用户名字段(第6列),例如 * * * * * root /path/to/script.sh
  • 不支持 @reboot@daily 等特殊时间语法,只接受标准五段时间格式

如何确认 /etc/cron.d/ 下的任务是否被 crond 加载

直接查 crond 的日志最可靠。多数发行版默认将 cron 日志发到 /var/log/cron(RHEL/CentOS)或 /var/log/syslog(Debian/Ubuntu)。用 grep 搜索 cron.d 目录相关线索:

sudo grep "cron.d" /var/log/cron 2>/dev/null || sudo grep "CRON" /var/log/syslog | grep -i "cron.d"

如果看到类似 READ /etc/cron.d/myjobLOAD /etc/cron.d/myjob 的记录,说明已加载;若无,则可能是权限、命名或语法问题。

  • 检查文件权限:ls -l /etc/cron.d/myjob —— 必须是 root:root,且不能有 group/others 的写权限(即 0644 合理,0664 会被拒绝)
  • 检查文件末尾是否有空行:某些老版本 crond(如 v8.1.5 之前)会因最后一行为空而跳过整个文件
  • 确认时间字段后紧跟着用户名,中间不能有多余空格或制表符混用(建议全用空格)

任务在执行但没日志?快速验证是否真由 cron.d 触发

在脚本开头加一行日志输出,绕过 syslog,直写文件:

通义千问
通义千问

阿里巴巴推出的全能AI助手

下载
echo "$(date): started by $(ps -o comm= $PPID)" >> /tmp/myjob.debug 2>&1

这样能区分是 cron.d 调用、手动运行,还是其他进程(比如 systemd timer 或另一个 crontab)触发的。

  • 如果 $PPID 对应的 commcrond,基本锁定是 cron.d 或系统 crontab 执行的
  • 如果看到 bashsh,再往上查 ps -o pid,ppid,comm= $PPID,可能父进程是某个 wrapper 脚本
  • 注意:有些任务会重定向 stdout/stderr 到 /dev/null,导致你以为“没输出”,其实执行了

常见静默失败原因:语法合法但不生效

即使 crond 加载了文件,任务也可能因环境差异“看似没执行”。最典型的是 PATH 和 SHELL 不同:

  • 系统级 cron.d 默认使用 /bin/sh,不是 /bin/bash;如果脚本里用了 [[source,可能直接报错退出
  • 默认 PATH=/usr/bin:/bin,不含 /usr/local/bin 或用户 $HOME/bin;命令未带绝对路径就容易找不到
  • 没有继承 shell 的环境变量(如 $HOME$USER),~ 在脚本中不会展开,cd ~ 会失败
  • 某些发行版(如 Ubuntu)的 cron.d 会额外校验文件 mtime 是否早于 crond 启动时间,修改后需 sudo killall -HUP crond 或重启服务

真正难排查的,往往不是“没加载”,而是“加载了但执行失败又没留痕”。加绝对路径、显式指定 /bin/bash、重定向完整 stderr,比反复看 crontab -l 有用得多。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

233

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

常见的linux系统有哪些
常见的linux系统有哪些

linux系统有Ubuntu、Fedora、CentOS、Debian、openSUSE、Arch Linux、Gentoo、Slackware、Linux Mint、Kali Linux。更多关于linux系统的文章详情请阅读本专题下面的文章。php中文网欢迎大家前来学习。

810

2023.10.27

ubunt上安装和配置vnc
ubunt上安装和配置vnc

安装方法:安装VNC服务器、启动VNC服务器、设置VNC密码等等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

412

2023.12.28

ubuntu启动黑屏解决方法
ubuntu启动黑屏解决方法

ubuntu启动黑屏解决方法:检查是否是电源问题、检查内存是否接触不良、检查显卡问题等。想了解更多ubuntu的相关内容,可以阅读本专题下面的文章。

658

2023.12.28

为什么ubuntu有网络连接但不能上网
为什么ubuntu有网络连接但不能上网

ubuntu有网络连接但不能上网的原因:1、dns配置问题;2、代理服务器设置问题;3、网络防火墙设置问题;4、路由器或调制解调器设置问题;5、网络驱动程序问题;6、网络配置文件问题;7、其他问题。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

457

2024.09.05

ubuntu安装golang
ubuntu安装golang

本专题整合了ubuntu安装golang所有方法汇总,阅读下面的文章了解更多详细操作。

106

2025.12.13

centos
centos

PHP中文网为大家提供centos相关信息,CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,是免费的、开源的、可以重新分发的开源操作系统,PHP中文网提供centos相关文章,以及安装教程。

431

2023.06.16

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 49.9万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号