列出所有正在运行的cron作业

有没有办法看到我的服务器上正在运行的cron作业列表?

我想看到正在加载或命令的文件的名称。 再加上运行多久。

我在CentOS上。

cron守护进程只是代表用户运行命令。 您可以在/var/log/cron查看哪些命令已经运行,您可以查看所有常见的地方(/ var / spool / cron / ,/ etc / crontab,/etc/cron.d /,/ etc / cron。*,/ etc / anacrontab&c)来获取cron运行的命令列表。

除此之外,每个stream程的运行时间都会有所不同,而且很难追踪到,所以你几乎肯定不能胜任这项工作。 你究竟想实现什么?

这是快速和肮脏的。 我几乎觉得不好意思发布这么多pipe道的东西,因为我确信有更有效的方法。 然而,它完成了工作,你可以从中学习,并改善自己。

您可以parsingcrond的进程树来查找当前的subprocess。

 cronpid="$(pgrep -P 1 crond)" cronjobs="$(pstree -p $cronpid | sed 's/)/)\n/g' | grep -v crond | grep -wo '[0-9]*')" 

说明:

  • pgrep命令返回父PID为1的crond的PID。
  • pstree命令返回crond进程的进程树。
  • sed命令将进程树的输出分成多行。 (为了下一个命令的目的)
  • 第一个grep是从输出中排除crond本身。
  • 第二个grep是提取其余进程的PID。 现在输出已经减less到正在运行的cron作业。 ( $cronjobs

现在,您可以对上面返回的PID进行循环,并为每个作业分别进行查询,以确定它已经运行了多久,以及命令是什么。

 for job in ${cronjobs[@]}; do ps -p "$job" -o etime,cmd --no-headers done 

示例输出:

  01:06 /usr/bin/sleep 90 00:06 /usr/bin/sleep 90 

此外,crontab具有-u选项来列出特定用户的cron作业。 对于运行时间,如果作业已经输出,它将通过电子邮件发送给用户,所以您可以区分预定的开始时间和电子邮件的到达之间的差异,粗略地了解工作需要多长时间。 cron本身不会跟踪运行时间。

对于当前正在运行的作业,除非作业是从/etc/cron.*运行的,否则很难在没有引用cron时间表的情况下获得。 在这种情况下,ps可以用来跟踪这样的工作。