有没有办法查看我的服务器上正在运行的 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
在文本文件中逐行打印。你需要定义输出