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

Unix 如何列出所有用户的所有cron作业?,unix,cron,Unix,Cron,是否有一个命令或现有脚本可以让我同时查看*NIX系统的所有定时cron作业?我希望它包括所有用户crontab,以及/etc/crontab,以及/etc/cron.d中的任何内容。在/etc/crontab中可以看到运行部件运行的特定命令 理想情况下,我希望输出是一个漂亮的列形式,并以某种有意义的方式进行排序 然后,我可以合并来自多个服务器的这些列表,以查看整个“事件时间表” 我本来打算自己写这样一个脚本,但是如果有人已经遇到麻烦了…您必须以root用户身份运行此脚本,但是: for user

是否有一个命令或现有脚本可以让我同时查看*NIX系统的所有定时cron作业?我希望它包括所有用户crontab,以及
/etc/crontab
,以及
/etc/cron.d
中的任何内容。在
/etc/crontab
中可以看到
运行部件运行的特定命令

理想情况下,我希望输出是一个漂亮的列形式,并以某种有意义的方式进行排序

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


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

您必须以root用户身份运行此脚本,但是:

for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
将循环遍历每个用户名,列出它们的crontab。crontab由各自的用户拥有,因此您将无法看到其他用户的crontab,而不是他们或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/:/      /")
如果我想让它更彻底,我可能会这样做:

(cd /var/cron/tabs && grep -vH ^# *) 
(cd /var/cron/tabs && grep -vH ^# * | sed "s/:/      /")
其中,这是sed替换部分中的文本选项卡


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

我最后编写了一个脚本(我试图自学bash脚本的精妙之处,这就是为什么在这里看不到类似Perl的东西)。这不是一件简单的事情,但它满足了我的大部分需求。它使用Kyle的建议来查找单个用户的crontab,但也处理
/etc/crontab
(包括
/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
请注意,它显示了用户,并或多或少地按小时和分钟进行排序,以便我可以查看每日日程安排

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

#/bin/bash
#系统范围的crontab文件和cron作业目录。为您的系统更改这些。
CRONTAB='/etc/CRONTAB'
CRONDIR='/etc/cron.d'
#单制表符。非常必要。
tab=$(echo-en“\t”)
#给定crontab行流,排除非cron作业行,替换
#使用单个空格填充空格字符,并从
#每行的开头。
函数clean_cron_line(){
边读边做
回显“${line}”|
egrep—反转匹配“^($|\s*||\s*[[:alnum:][uU3]+=)”|
sed--regexp扩展的“s/\s+//g”|
sed--regexp扩展的“s/^/”
完成;
}
#给定一个干净的crontab行流,回显任何不包括
#“运行零件”命令,对于执行此命令的零件,显示“运行零件”中的每个作业文件
#目录,就好像它是显式计划的一样。
函数查找\运行\部件(){
边读边做
match=$(echo“${line}”| egrep-o'运行部件({1,2}\S+*\S+)
如果[[-z“${match}”]];则
回显“${line}”
其他的
cron_字段=$(回显“${line}”|剪切-f1-6-d')
cron_job_dir=$(echo“${match}”| awk'{print$NF}')
如果[[-d“${cron_job_dir}”];则
对于“${cron_job_dir}”/*;do#*”中的cron_job_文件
[[-f“${cron_作业文件}”]&&echo“${cron_字段}${cron_作业文件}”
完成
fi
fi
完成;
}
#crontab行的临时文件。
温度=$(mktemp)| |退出1
#从系统范围的crontab文件添加所有作业。
cat“${CRONTAB}”|清洁| cron|u线|查找|运行|零件>“${temp}”
#从系统范围的cron目录添加所有作业。
cat“${CRONDIR}”/*|清洁_cron_line>>“${temp}”#*/
#添加每个用户的crontab(如果存在)。在
#五个时间字段和命令。
读用户时;做
crontab-l-u“${user}”2>/dev/null|
清洁cron线|
sed--regexp扩展的“s/^((\s++){5})(.++$/\1${user}\3/”>“${temp}”

在Ubuntu或debian下完成,您可以通过
/var/spool/cron/crontab/
查看crontab,然后每个用户都有一个文件。当然,这只适用于特定于用户的crontab


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

下面,感谢您提供了这个非常有用的脚本。我在旧系统(Red Hat Enterprise 3,它以字符串形式处理不同的egrep和制表符)和其他在/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" |
2a3,4
>#见:http://stackoverflow.com/questions/134906/how-do-i-list-all-cron-jobs-for-all-users
>
27c29,30
#match=$(echo“${line}”| egrep-o'运行部件({1,2}\S+*\S+))
>match=$(echo“${line}”| egrep-o'运行部件。*')
51c54,57
>“${temp}”#*/
---
>sys_cron_num=$(ls/etc/cron.d | wc-l | awk'{print$1}')
>如果[“$sys\u cron\u num”!=0];然后
>cat“${CRONDIR}”/*|清洁_cron_line>>“${temp}”#*/
>fi
67c73
sed“1i\mi${tab}h${tab}d${tab}m${tab}w${tab}用户${tab}命令”|

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

我喜欢上面简单的一行回答:

对于用户,单位为$(cut-f1-d:/etc/passwd);do 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
您将获得一个没有
grep -v "#" -R  /var/spool/cron/tabs
for user in $(cut -f1 -d: /etc/passwd); 
do 
    echo $user; crontab -u $user -l; 
done
tail -n 1000 /var/spool/cron/*
==> /var/spool/cron/root <==
15 2 * * * /bla

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
for user in $(tail -n +11 /etc/passwd | cut -f1 -d:); do echo $user; crontab -u $user -l; done
for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done    
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
sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
while IFS=":" read -r user _
do
   echo "crontab for user ${user}:"
   crontab -u "$user" -l
done < /etc/passwd
sudo crontab -u userName -l

,
cd /etc/cron.daily/
ls -l
cat filename
cd /etc/cron.d/
ls -l
cat filename
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
sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh
for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done
crontab -l username
crontab -u username -l
for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done
$ \cat ~jaroslav/bin/ls-crons 
#!/bin/bash
getent passwd | awk -F: '{ print $1 }' | xargs -I% sh -c 'crontab -l -u % | sed "/^$/d; /^#/d; s/^/% /"' 2>/dev/null
echo
cat /etc/crontab /etc/anacrontab 2>/dev/null | sed '/^$/d; /^#/d;'
echo
run-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
$ sudo ~jaroslav/bin/ls-crons 
jaroslav */5 * * * *  mv ~/java_error_in_PHPSTORM* ~/tmp 2>/dev/null
jaroslav 5 */24 * * * ~/bin/Find-home-files
jaroslav * 7 * * * cp /T/fortrabbit/ssh-config/fapps.tsv /home/jaroslav/reference/fortrabbit/fapps
jaroslav */8 1 * * * make -C /T/fortrabbit/ssh-config discover-apps # >/dev/null
jaroslav */7    * * * * getmail -r jazzoslav -r fortrabbit 2>/dev/null
jaroslav */1    * * * * /home/jaroslav/bin/checkmail
jaroslav *    9-18 * * * getmail -r fortrabbit 2>/dev/null

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22
1   5   cron.daily      nice run-parts /etc/cron.daily
7   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
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 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