我有一台运行 ubuntu 14.04 的服务器。在 /var/log/auth.log 中,有某种每小时运行一次的自动化进程,我想找出该进程是什么。
我已经确定没有任何用户安排 cron 作业。我所需要做的就是每小时检查 auth.log 中的以下示例行:
Dec 2 03:17:01 fi CRON[23537]: pam_unix(cron:session): session opened for user root by (uid=0)
Dec 2 03:17:01 fi CRON[23537]: pam_unix(cron:session): session closed for user root
Dec 2 04:17:01 fi CRON[23557]: pam_unix(cron:session): session opened for user root by (uid=0)
关于如何追踪此事有什么想法吗?
答案1
我已经确定没有任何用户安排的 cron 作业。
/etc/crontab
您可能错过了和中的系统范围的 cron 作业/etc/cron.d/*
。
如果似乎没有,您可以附加strace
到 cron 进程来查看它读取了哪些文件,或者执行了哪些命令:
strace -p 23537 -e file
strace -p 23537 -f -e execve [-s 10000]
在旧系统中,cron 可能在编译时没有自动重新加载支持,因此如果有人手动从 /etc/crontab 中删除作业但没有重新加载 cron,它们将继续运行,直到有人触发重新加载。
答案2
您可以使用atop
。
安装后,它将开始自动记录进程及其资源使用情况,并将数据写入日志文件。您可以稍等片刻以收集足够的数据,然后检查日志或解析它们。
例如,收集日志后,为了检查正在运行的进程,我建议使用以下命令:
atop -r /var/log/atop/atop_<current date> -b 03:16 -e 03:18 -P PRG | grep -P 'PRG.*\s23557\s\('
这会:
- 读取当天 03:16 至 03:18 之间的日志文件
- 使用有关流程的通用数据(包括流程名称)以机器可解析的方式输出数据
- 搜索记录了 PID 为 23557 的进程的行,这样您就可以看到用括号括起来的进程名称。 grep 模式是为了获得更高的准确性 - 该行始终以 开头
PRG
,值列以空格分隔(PID 是单独的列),PID 后的列是用括号括起来的进程名称(以 开头(
)。