在银河麒麟v10中排查cron触发进程需三重验证:一查crond服务状态(/etc/init.d/crond status);二用pstree -p | grep crond确认子进程树;三结合ps -eo pid,ppid,lstart,cmd筛选5分钟内启动且ppid属crond的进程,并辅以/proc/pid/environ和fd链接追溯任务来源。

在银河麒麟V10系统中排查由Cron定时任务触发的进程,需结合任务来源、执行时刻与进程特征三重验证,避免将手动运行或systemd启动的进程误判为cron派生进程。
确认当前活跃的cron守护进程及其子进程树
首先确保crond服务正在运行,否则后续所有cron派生进程均不存在:
执行:/etc/init.d/crond status
若状态非“running”,则跳过后续步骤——此时无任何cron触发的进程可查。
确认crond运行后,用pstree查看其完整子进程树:
执行:pstree -p | grep crond
输出中形如 crond(1234)───sh(5678)───date(5679) 的层级链,即表示该date进程由crond直接fork并exec启动,是典型的cron触发进程。注意:仅当sh或bash父进程PID属于crond子树时,才可认定为cron派生。
按启动时间筛选近5分钟内新创建的进程
定时任务常在整点/半点等固定时刻触发,进程生命周期短,需抓取“刚诞生”的实例:
第一步:获取当前时间戳(用于比对)
执行:date +%s
第二步:列出所有进程的启动秒数,并筛选距今≤300秒(5分钟)的条目
执行:ps -eo pid,ppid,lstart,cmd --sort=-lstart | head -n 20
第三步:对结果中每个进程,检查其PPID是否指向crond进程(如PPID=1234,而ps -p 1234 -o comm=返回crond),满足即为cron触发。
【关键提醒】不要依赖ps -ef | grep cron——它只能匹配命令行含“cron”字样的进程,漏掉真正由cron调起但命令行不含该词的脚本进程(如/opt/backup.sh)。
方法一:通过/proc/PID/environ反向追溯cron上下文
当某个可疑进程疑似cron触发但父进程已退出(常见于后台任务),可通过环境变量取证:
执行:cat /proc/<em>PID</em>/environ | tr '\0' '\n' | grep -E '^(SHELL|HOME|LOGNAME|USER)=|^PATH='(将PID替换为实际进程号)
若输出中包含LOGNAME=root且SHELL=/bin/sh,同时HOME=/root,而该进程又不在用户登录会话中(如tty为?),则极大概率来自/etc/crontab或root用户的crontab任务。
方法二:检查进程打开的文件描述符是否关联cron配置
执行:ls -l /proc/<em>PID</em>/fd/ 2>/dev/null | grep -E 'crontab|/etc/cron|/var/spool/cron'
若发现类似lr-x------ 1 root root 64 Sep 3 21:30 255 -> /var/spool/cron/root的链接,则该进程正在读取某用户crontab文件,属cron调度链环节。
定位正在执行的定时任务对应行
① 先获取目标进程的完整命令行:
执行:ps -p <em>PID</em> -o cmd=
② 提取命令路径(如/usr/bin/date或/bin/bash /opt/clean.sh)
③ 在所有crontab源中搜索该命令字符串:
执行:for f in $(sudo ls /var/spool/cron/* /etc/crontab /etc/cron.d/* 2>/dev/null); do echo "== $f =="; sudo grep -H "$CMD" "$f" 2>/dev/null; done(将$CMD替换为上一步提取的命令)
④ 若在/etc/crontab中命中,检查该行第六字段用户名是否与进程USER环境变量一致;若在/var/spool/cron/xxx中命中,则该行所属用户即为任务发起者。











