unix - 如何列出所有用户的所有cron作业?

  显示原文与译文双语对照的内容

是否有命令或者现有脚本可以让我同时查看系统 *NIX 作业的所有? 我希望它包括所有用户 crontab,以及 /etc/crontab,以及任何 /etc/cron.d 。 在它最好也可以看到具体的命令由运行

理想情况下,我希望以漂亮的列形式输出,并以一些有意义的方式排序。

然后,我可以合并来自多个服务器的这些列表来查看整个"事件日程"。"

我本来打算自己写这样一个脚本,但是如果已经有人遇到麻烦了- 。

时间:

你必须将它的作为根运行,但:


for user in $(cut -f1 -d:/etc/passwd); do crontab -u $user -l; done

将循环遍历每个用户名列出它的crontab 。 crontabs,归各自的用户所以你将无法看到另一个用户的crontab中的分散成被他们或者根。


如果你想知道,这用户所做的一个crontab中的属于插入- echo $ user编辑


for user in $(cut -f1 -d:/etc/passwd); do echo $user; crontab -u $user -l; done

我最终编写了一个脚本( 我试图教自己bash脚本的更精细点,所以这就是为什么你在这里看不到 Perl ) 。 这并不是一个简单的事情,但它大部分是我所需要的。 它使用kyle的建议查找单个用户的'crontab,还处理 /etc/crontab ( 包括 run-parts 中由 /etc/cron.hourly/etc/cron.daily,等等 启动的脚本) ) 和 /etc/cron.d 目录中的作业。 它接受所有这些并将它们合并到一个类似如下的显示中:


mi h d m w user command
09,39 * * * * root [ -d/var/lib/php5 ] && find/var/lib/php5/-type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm
47 */8 * * * root rsync -axE --delete --ignore-errors//mirror/>/dev/null
17 1 * * * root/etc/cron.daily/apt
17 1 * * * root/etc/cron.daily/aptitude
17 1 * * * root/etc/cron.daily/find
17 1 * * * root/etc/cron.daily/logrotate
17 1 * * * root/etc/cron.daily/man-db
17 1 * * * root/etc/cron.daily/ntp
17 1 * * * root/etc/cron.daily/standard
17 1 * * * root/etc/cron.daily/sysklogd
27 2 * * 7 root/etc/cron.weekly/man-db
27 2 * * 7 root/etc/cron.weekly/sysklogd
13 3 * * * archiver/usr/local/bin/offsite-backup 2>&1
32 3 1 * * root/etc/cron.monthly/standard
36 4 * * * yukon/home/yukon/bin/do-daily-stuff
5 5 * * * archiver/usr/local/bin/update-logs>/dev/null

请注意,它显示用户,more-or-less按小时和分钟排序,这样我可以看到每日日程。

到目前为止,我已经在 Ubuntu,Debian和红帽上测试过它。


#!/bin/bash

# System-wide crontab file and cron job directory. Change these for your system.
CRONTAB='/etc/crontab'
CRONDIR='/etc/cron.d'

# Single tab character. Annoyingly necessary.
tab=$(echo -en"t")

# Given a stream of crontab lines, exclude non-cron job lines, replace
# whitespace characters with a single space, and remove any spaces from the
# beginning of each line.
function clean_cron_lines() {
 while read line ; do
 echo"${line}" |
 egrep --invert-match '^($|s*#|s*[[:alnum:]_]+=)' |
 sed --regexp-extended"s/s+//g" |
 sed --regexp-extended"s/^//"
 done;
}

# Given a stream of cleaned crontab lines, echo any that don't include the
# run-parts command, and for those that do, show each job file in the run-parts
# directory as if it were scheduled explicitly.
function lookup_run_parts() {
 while read line ; do
 match=$(echo"${line}" | egrep -o 'run-parts (-{1,2}S+ )*S+')

 if [[ -z"${match}" ]] ; then
 echo"${line}"
 else
 cron_fields=$(echo"${line}" | cut -f1-6 -d' ')
 cron_job_dir=$(echo"${match}" | awk '{print $NF}')

 if [[ -d"${cron_job_dir}" ]] ; then
 for cron_job_file in"${cron_job_dir}"/* ; do # */<not a comment>
 [[ -f"${cron_job_file}" ]] && echo"${cron_fields} ${cron_job_file}"
 done
 fi
 fi
 done;
}

# Temporary file for crontab lines.
temp=$(mktemp) || exit 1

# Add all of the jobs from the system-wide crontab file.
cat"${CRONTAB}" | clean_cron_lines | lookup_run_parts>"${temp}" 

# Add all of the jobs from the system-wide cron directory.
cat"${CRONDIR}"/* | clean_cron_lines>> "${temp}" # */<not a comment>

# Add each user's crontab (if it exists). Insert the user's name between the
# five time fields and the command.
while read user ; do
 crontab -l -u"${user}" 2>/dev/null |
 clean_cron_lines |
 sed --regexp-extended"s/^((S+ +){5})(.+)$/1${user} 3/">> "${temp}"
done <<(cut --fields=1 --delimiter=:/etc/passwd)

# Output the collected crontab lines. Replace the single spaces between the
# fields with tab characters, sort the lines by hour and minute, insert the
# header line, and format the results as a table.
cat"${temp}" |
 sed --regexp-extended"s/^(S+) +(S+) +(S+) +(S+) +(S+) +(S+) +(.*)$/1t2t3t4t5t6t7/" |
 sort --numeric-sort --field-separator="${tab}" --key=2,1 |
 sed"1imithtdtmtwtusertcommand" |
 column -s"${tab}" -t

rm --force"${temp}"

一个小的优化Kyle回答,并改进了输出格式:


#!/bin/bash
for user in $(cut -f1 -d:/etc/passwd)
do echo $user && crontab -u $user -l
echo""
done


getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print"$_n$ln" if $l}'

这避免了对passwd的直接干扰,跳过了没有cron条目的用户,并且为那些拥有他们的用户打印了用户名和内容。

大多数情况下将它的放到这里,这样我可以在以后找到它的时候再找到它。

如果使用NIS检查群集,那么查看用户是否有crontab条目的唯一方法是根据 matt/var/spool/cron/tabs.的回答


grep -v"#" -R/var/spool/cron/tabs

取决于你的linux版本,但我使用:


tail -n 1000/var/spool/cron/*

作为根,非常简单,非常短。

给出如下输出:


==>/var/spool/cron/root <==
15 2 * * */bla

==>/var/spool/cron/my_user <==
*/10 1 * * */path/to/script

感谢这个非常有用的脚本。 我在旧系统( 红帽企业 3,处理字符串中的egrep和制表符不同) 上运行了一些小的问题,在/etc/cron./( 脚本然后以错误结束) 中没有任何东西。 下面是一个使它在这种情况下发挥作用的补丁:


2a3,4
> #See: http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users
>
27c29,30
 <match=$(echo"${line}" | egrep -o 'run-parts (-{1,2}S+ )*S+')
---
> #match=$(echo"${line}" | egrep -o 'run-parts (-{1,2}S+ )*S+')
> match=$(echo"${line}" | egrep -o 'run-parts.*')
51c54,57
 <cat"${CRONDIR}"/* | clean_cron_lines>> "${temp}" # */<not a comment>
---
> sys_cron_num=$(ls/etc/cron.d | wc -l | awk '{print $1}')
> if ["$sys_cron_num"!= 0 ]; then
> cat"${CRONDIR}"/* | clean_cron_lines>> "${temp}" # */<not a comment>
> fi
67c73
 <sed"1imithtdtmtwtusertcommand" |
---
> sed"1imi${tab}h${tab}d${tab}m${tab}w${tab}user${tab}command" |

我不确定第一个radiobutton的更改是一个好主意,但是这个脚本已经在 RHEL3,4,5 和Debian5上测试过,没有任何问题。 希望有帮助!

...