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

是否有命令或现有的脚本可以让我一次查看*NIX系统的所有计划cron作业?我希望它包括所有用户crontab,以及/etc/crontab,以及/etc/cron.d中的任何内容。很高兴看到/etc/crontabrun-parts运行的特定命令。

理想情况下,我想要一个漂亮的列形式的输出,并以某种有意义的方式排序。

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

我本打算自己写这样的剧本,但如果有人已经麻烦了…

1003715 次浏览

您必须以root身份运行它,但是:

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

将循环遍历每个用户名,列出他们的crontab。crontab由各自的用户拥有,因此您将无法看到另一个用户的crontab w/o是他们或root。


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

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/:/      /")

这是一个文字选项卡在ed替换部分。

循环遍历/etc/passwd中的用户并为每个用户执行crontab -l -u $user可能更独立于系统。

最后我写了一个脚本(我正在努力自学bash脚本的细节,所以你在这里看不到类似Perl的东西)。这并不是一件简单的事情,但它完成了我需要的大部分。它使用了Kyle的建议来查找单个用户的crontab,但也处理/etc/crontab(包括run-parts/etc/cron.hourly/etc/cron.daily等中启动的脚本)和/etc/cron.d目录中的作业。它接受所有这些并将它们合并成一个显示,如下所示:

mi     h    d  m  w  user      command09,39  *    *  *  *  root      [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm47     */8  *  *  *  root      rsync -axE --delete --ignore-errors / /mirror/ >/dev/null17     1    *  *  *  root      /etc/cron.daily/apt17     1    *  *  *  root      /etc/cron.daily/aptitude17     1    *  *  *  root      /etc/cron.daily/find17     1    *  *  *  root      /etc/cron.daily/logrotate17     1    *  *  *  root      /etc/cron.daily/man-db17     1    *  *  *  root      /etc/cron.daily/ntp17     1    *  *  *  root      /etc/cron.daily/standard17     1    *  *  *  root      /etc/cron.daily/sysklogd27     2    *  *  7  root      /etc/cron.weekly/man-db27     2    *  *  7  root      /etc/cron.weekly/sysklogd13     3    *  *  *  archiver  /usr/local/bin/offsite-backup 2>&132     3    1  *  *  root      /etc/cron.monthly/standard36     4    *  *  *  yukon     /home/yukon/bin/do-daily-stuff5      5    *  *  *  archiver  /usr/local/bin/update-logs >/dev/null

请注意,它显示用户,并且或多或少按小时和分钟排序,以便我可以看到每日时间表。

到目前为止,我已经在Ubuntu、Debian和Red Hat AS上测试了它。

#!/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 ; doecho "${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 ; domatch=$(echo "${line}" | egrep -o 'run-parts (-{1,2}\S+ )*\S+')
if [[ -z "${match}" ]] ; thenecho "${line}"elsecron_fields=$(echo "${line}" | cut -f1-6 -d' ')cron_job_dir=$(echo  "${match}" | awk '{print $NF}')
if [[ -d "${cron_job_dir}" ]] ; thenfor cron_job_file in "${cron_job_dir}"/* ; do  # */ <not a comment>[[ -f "${cron_job_file}" ]] && echo "${cron_fields} ${cron_job_file}"donefifidone;}
# 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 ; docrontab -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。

对于Redhat 6/7和Centos,crontab位于/var/spool/cron/之下。

感谢这个非常有用的脚本。我在旧系统(Red Hat Enterprise 3,它处理字符串中的egrep和tab不同)和其他 /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>> fi67c73<     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上进行了测试,没有任何问题。希望这有帮助!

我喜欢上面这个简单的答案:

对于$(Cut-f1-d: /etc/passwd)中的用户,执行crontab-u$user-l;完成

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

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

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

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。

主要是把这个放在这里,这样我以后就可以找到它,以防我需要再次搜索它。

通过改进的输出格式对Kyle Burton的回答进行了小改进:

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

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

grep -v "#" -R  /var/spool/cron/tabs
for user in $(cut -f1 -d: /etc/passwd);doecho $user; crontab -u $user -l;done

取决于您的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之上

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

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

for user in $(cut -f1 -d: /etc/passwd); doecho $user >> crontab.bakecho "" >> crontab.bakcrontab -u $user -l >> crontab.bak 2>> > crontab.bakdone

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

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

我认为下面是一个更好的内线。例如,如果您有NIS或LDAP用户,他们就不会在 /etc/passwd.这将为您提供每个登录用户的crontab。

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

由于这是一个循环遍历文件(/etc/passwd)并执行操作的问题,我错过了如何逐行(和/或逐字段)读取文件(数据流、变量)?的正确方法:

while IFS=":" read -r user _doecho "crontab for user ${user}:"crontab -u "$user" -ldone < /etc/passwd

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

这样,我们就可以使用变量$user调用crontab -u,我们引用它是为了安全起见(如果它包含空格怎么办?在这样的文件中不太可能,但你永远不会知道)。

您可以为所有用户列表编写:

sudo crontab -u userName -l
,

你也可以去

cd /etc/cron.daily/ls -lcat filename

该文件将列出时间表

cd /etc/cron.d/ls -lcat filename

以下内容删除了没有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.sh45 3 * * * /opt/mysql-backups/mysql-backups.sh5 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)上使用它。

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

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

从ROOT用户获取列表。

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

在Solaris上,对于特定的已知用户名:

crontab -l username

要在Solaris上一次获取所有用户的作业,就像上面的其他帖子一样:

for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done

更新:请停止建议在Solaris上错误的编辑:输入图片描述

带着歉意和感谢Yukon的家伙。

我试图总结时间设置以便于阅读,虽然这不是一个完美的工作,我不碰“每周五”或“只在星期一”的东西。

这是第10版-现在:

  • 跑得更快
  • 具有可选的进度字符,因此您可以进一步提高速度。
  • 使用分隔线来分隔标头和输出。
  • 输出在一个紧凑的格式时,所有遇到的定时间隔可以总结。
  • 接受每年数月的Jan… Dec描述符
  • 接受周一…周日一周中几天的描述符
  • 尝试在缺少时处理anacron的debian风格的傻瓜化
  • 尝试处理crontab行,这些行在使用“[-x…]”预先测试可执行性后运行文件
  • 尝试处理使用“命令-v”预测试可执行性后运行文件的crontab行
  • 允许使用间隔跨度和列表。
  • 支持在用户特定的 /var/spoolcrontab文件中使用运行部件。

我现在在这里完整地发布脚本。

https://gist.github.com/myshkin-uk/d667116d3e2d689f23f18f6cd3c71107

虽然许多答案产生了有用的结果,但我认为为这项任务维护复杂脚本的喧嚣是不值得的。这主要是因为大多数发行版使用不同的cron守护进程。

观察和学习,孩子和老人。

$ \cat ~jaroslav/bin/ls-crons#!/bin/bashgetent passwd | awk -F: '{ print $1 }' | xargs -I% sh -c 'crontab -l -u % | sed "/^$/d; /^#/d; s/^/% /"' 2>/dev/nullechocat /etc/crontab /etc/anacrontab 2>/dev/null | sed '/^$/d; /^#/d;'echorun-parts --list /etc/cron.hourly;run-parts --list /etc/cron.daily;run-parts --list /etc/cron.weekly;run-parts --list /etc/cron.monthly;

像这样跑

$ sudo ls-cron

示例输出(Gentoo)

$ sudo ~jaroslav/bin/ls-cronsjaroslav */5 * * * *  mv ~/java_error_in_PHPSTORM* ~/tmp 2>/dev/nulljaroslav 5 */24 * * * ~/bin/Find-home-filesjaroslav * 7 * * * cp /T/fortrabbit/ssh-config/fapps.tsv /home/jaroslav/reference/fortrabbit/fappsjaroslav */8 1 * * * make -C /T/fortrabbit/ssh-config discover-apps # >/dev/nulljaroslav */7    * * * * getmail -r jazzoslav -r fortrabbit 2>/dev/nulljaroslav */1    * * * * /home/jaroslav/bin/checkmailjaroslav *    9-18 * * * getmail -r fortrabbit 2>/dev/null
SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootRANDOM_DELAY=45START_HOURS_RANGE=3-221   5   cron.daily      nice run-parts /etc/cron.daily7   25  cron.weekly     nice run-parts /etc/cron.weekly@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly
/etc/cron.hourly/0anacron/etc/cron.daily/logrotate/etc/cron.daily/man-db/etc/cron.daily/mlocate/etc/cron.weekly/mdadm/etc/cron.weekly/pfl

示例输出(Ubuntu)

SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
/etc/cron.hourly/btrfs-quota-cleanup/etc/cron.hourly/ntpdate-debian/etc/cron.daily/apport/etc/cron.daily/apt-compat/etc/cron.daily/apt-show-versions/etc/cron.daily/aptitude/etc/cron.daily/bsdmainutils/etc/cron.daily/dpkg/etc/cron.daily/logrotate/etc/cron.daily/man-db/etc/cron.daily/mlocate/etc/cron.daily/passwd/etc/cron.daily/popularity-contest/etc/cron.daily/ubuntu-advantage-tools/etc/cron.daily/update-notifier-common/etc/cron.daily/upstart/etc/cron.weekly/apt-xapian-index/etc/cron.weekly/man-db/etc/cron.weekly/update-notifier-common

图片

ubuntu:

ubuntu

Gentoo:

gentoo

我倾向于使用以下小命令来列出单个用户和基于Unix的操作系统上所有用户的所有作业,并使用现代bash控制台:

1.单用户

 echo "Jobs owned by $USER" && crontab -l -u $USER

2.所有用户

for wellknownUser in $(cut -f1 -d: /etc/passwd);doecho "Jobs owned by $wellknownUser";crontab -l -u $wellknownUser;echo -e "\n";sleep 2;  # (optional sleep 2 seconds) while drinking a coffeedone

我做了下面一个班轮脚本,它为我列出了所有用户的所有cron作业。

cat /etc/passwd |awk -F ':' '{print $1}'|while read a;do crontab -l -u ${a} ; done