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

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

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

我想查看正在加载的文件或命令的名称。以及它运行了多长时间。

我在 CentOS 上。

答案1

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

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

答案2

这既快捷又粗糙。我几乎不好意思发布包含如此多管道的内容,因为我确信有更有效的方法。但是,它完成了工作,您可以从中学习并自行改进。

您可以解析 crond 的进程树来查找当前的子进程。

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

解释:

  • pgrep命令返回 crond 的 PID,其中父 PID 为 1。
  • pstree命令返回 crond 进程的进程树。
  • sed命令将进程树输出拆分为多行。(为了下一个命令的目的。)
  • 首先grep是从输出中排除 crond 本身。
  • 第二个grep是提取剩余进程的 PID。输出现已减少到仅正在运行的 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

答案3

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

对于当前正在运行的作业,如果不参考 cron 计划,则很难获取,除非作业是从 /etc/cron.* 运行的。在这种情况下,可以使用 ps 来跟踪此类作业。

答案4

这对于文本处理也非常强大

printf "%s \n%s \n%s \n" "$OUTPUT1" "$OUTPUT2" "$OUTPUT3" | cat - /var/startup/forex/unhandled/num.txt >> temp && mv temp /var/startup/forex/unhandled/num.txt

在文本文件中逐行打印。你需要定义输出

相关内容