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

有一个命令或现有的脚本,可以让我一次查看所有* NIX系统的预定cron作业吗? 我希望它包含所有用户crontabs,以及/etc/crontab ,以及/etc/cron.d 。 看到由/etc/crontab run-parts运行的特定命令也是很好的。

理想情况下,我想输出一个很好的列forms,并以一些有意义的方式sorting。

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

我正准备自己写这样一个剧本,但是如果有人已经麻烦了…

你将不得不以root身份运行它,但是:

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

将遍历每个用户名列出他们的crontab。 crontabs由相应的用户拥有,所以你将无法看到另一个用户的crontab不是他们或者root。


如果你想知道一个crontab属于哪个用户,请编辑 echo $user

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

我最终写了一个脚本(我试图自我教导bash脚本的更精细的点,所以这就是为什么你在这里看不到像Perl这样的东西)。 这不完全是一件简单的事情,但它大部分是我需要的。 它使用Kyle的build议来查找个人用户的crontabs,而且还处理/etc/crontab (包括由/etc/cron.dailyrun-parts启动的脚本)和作业在/etc/cron.d目录下。 它把所有这些都合并成一个如下所示的显示:

 mi hdmw 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 

请注意,它显示了用户,并且按小时和分钟sorting,以便我可以看到每天的时间表。

到目前为止,我已经在Ubuntu,Debian和Red Hat AS上进行了testing。

 #!/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+) +(.*)$/\1\t\2\t\3\t\4\t\5\t\6\t\7/" | sort --numeric-sort --field-separator="${tab}" --key=2,1 | sed "1i\mi\th\td\tm\tw\tuser\tcommand" | column -s"${tab}" -t rm --force "${temp}" 

在Ubuntu或debian下,你可以通过/var/spool/cron/crontabs/查看crontab,然后为每个用户提供一个文件。 这当然只适用于用户特定的crontab。

这将显示所有用户的所有crontab条目。

 sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh 

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

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

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

给我这样的输出:

 ==> /var/spool/cron/root <== 15 2 * * * /bla ==> /var/spool/cron/my_user <== */10 1 * * * /path/to/script 

凯尔·伯顿(Kyle Burton)提供的改进输出格式的小小改进:

 #!/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$l\n" if $l}' 

这可以避免直接与passwd混淆,跳过没有cron条目的用户,为那些拥有它们的用户打印出用户名以及他们的crontab。

大多数情况下,在这里,但我可以find它,以防万一我需要再次search它。

如果您使用NIS检查群集,则根据Matt的答案/ var / spool / cron / tabs,查看用户是否具有crontab条目的唯一方法是。

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

我喜欢上面简单的一行代码的答案:

用户在$(cut -f1 -d:/ etc / passwd); 做crontab -u $ user -l; DONE

但是没有-u标志的Solaris并不打印正在检查的用户,你可以这样修改它:

 for user in $(cut -f1 -d: /etc/passwd); do echo User:$user; crontab -l $user 2>&1 | grep -v crontab; done 

当一个账户不允许使用cron时,你将得到没有crontab抛出错误的用户列表。注意,在Solaris中,angular色也可以在/ etc / passwd中(参见/ etc / user_attr)。

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

取决于你的cron版本。 在FreeBSD上使用Vixie cron,我可以这样做:

 (cd /var/cron/tabs && grep -vH ^# *) 

如果我想要更多的选项卡删除,我可能会这样做:

 (cd /var/cron/tabs && grep -vH ^# * | sed "s/:/ /") 

这是sedreplace部分中的字面标签。

/etc/passwd循环访问用户可能更独立于系统,并为每个crontab -l -u $user执行crontab -l -u $user

以下消除注释,空行和来自没有crontab的用户的错误。 你只剩下一个明确的用户和他们的工作清单。

注意在第二行使用sudo 。 如果你已经是root的,删除它。

 for USER in $(cut -f1 -d: /etc/passwd); do \ USERTAB="$(sudo crontab -u "$USER" -l 2>&1)"; \ FILTERED="$(echo "$USERTAB"| grep -vE '^#|^$|no crontab for|cannot use this program')"; \ if ! test -z "$FILTERED"; then \ echo "# ------ $(tput bold)$USER$(tput sgr0) ------"; \ echo "$FILTERED"; \ echo ""; \ fi; \ done 

示例输出:

 # ------ root ------ 0 */6 * * * /usr/local/bin/disk-space-notify.sh 45 3 * * * /opt/mysql-backups/mysql-backups.sh 5 7 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade # ------ sammy ------ 55 * * * * wget -O - -q -t 1 https://www.example.com/cron.php > /dev/null 

我在Ubuntu(12到16)和Red Hat(5到7)上使用它。

感谢这个非常有用的脚本。 我在旧系统上运行它(Red Hat Enterprise 3,它在string中处理不同的egrep和tabs)和其他在/etc/cron.d/中没有任何内容的系统(脚本然后以错误结束)有一些小问题。 所以这里是一个补丁,使其在这种情况下工作:

 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 "1i\mi\th\td\tm\tw\tuser\tcommand" | --- > sed "1i\mi${tab}h${tab}d${tab}m${tab}w${tab}user${tab}command" | 

我不确定第一个egrep的变化是一个好主意,但是,这个脚本已经在RHEL3,4,5和Debian5上testing了,没有任何问题。 希望这可以帮助!

build立在@凯尔之上

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

避免通常位于/ etc / passwd顶部的注释,

在macosx上

 for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done 

我认为更好的一个class轮将在下面。 例如,如果你有NIS或LDAP用户,他们不会在/ etc / passwd中。 这会给你login每个用户的crontabs。

 for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done 

你可以写所有的用户列表:

 sudo crontab -u userName -l , 

你也可以去

 cd /etc/cron.daily/ ls -l cat filename 

这个文件将列出时间表

 cd /etc/cron.d/ ls -l cat filename 

由于它是通过文件( /etc/passwd )循环并执行操作的问题,所以我错过了正确的方法如何逐行读取文件(数据stream,variables)(和/或字段逐场)? :

 while IFS=":" read -r user _ do echo "crontab for user ${user}:" crontab -u "$user" -l done < /etc/passwd 

这读取/etc/passwd:使用:作为字段分隔符。 通过说read -r user _ ,我们让$user保存第一个字段,其余的(只是一个垃圾variables忽略字段)。

这样,我们可以使用variables$user来调用crontab -u ,我们引用这个variables是为了安全(如果它包含空格呢?在这个文件中不太可能,但永远不会知道)。

这个脚本在CentOS中为我工作,列出环境中的所有cron:

 sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh 

对我来说看看/ var / spool / cron / crontabs是最好的方法

该脚本将Crontab输出到文件,并列出所有用户确认没有crontab条目的用户:

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