是否有一个命令或现有的脚本可以让我一次查看*NIX系统的所有调度cron作业?我希望它包括所有用户crontab,以及/etc/crontab,以及/etc/cron.d.中的任何内容如果能在/etc/ crontable中看到run-parts运行的特定命令,那就太好了。

理想情况下,我希望输出以良好的列形式,并以某种有意义的方式排序。

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

我本来打算自己写一个这样的脚本,但如果有人已经费心了……


当前回答

下面剥离了不使用crontab的用户的注释、空行和错误。剩下的就是一个清晰的用户列表和他们的工作。

注意,在第二行中使用了sudo。如果你已经是根用户了,移除它。

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)上使用这个。

其他回答

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

crontab -l username

要在Solaris上一次性获得所有用户的作业,就像上面的其他文章一样:

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

更新: 请停止建议Solaris上的错误编辑:

对Kyle Burton的回答稍加改进,改进了输出格式:

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

你必须以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

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

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

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

输出如下:

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

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

从ROOT用户获取列表。

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