923

* NIXシステムのスケジュールされたすべてのcronジョブを一度に表示できるコマンドまたは既存のスクリプトはありますか?/etc/crontabすべてのユーザーcrontabと、、およびに含まれるものをすべて含めたいと思います/etc/cron.drun-partsで実行される特定のコマンドを確認するのもよいでしょう/etc/crontab

理想的には、出力を素敵な列形式で、意味のある方法で並べ替えたいと思います。

次に、これらのリストを複数のサーバーからマージして、全体的な「イベントのスケジュール」を表示できます。

私はそのようなスクリプトを自分で書き込もうとしていましたが、誰かがすでに問題を抱えている場合は...

4

26 に答える 26

1219

これをルートとして実行する必要がありますが、次のようになります。

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
于 2008-09-25T18:07:49.977 に答える
326

私は最終的にスクリプトを書きました (私は bash スクリプトの細かい点を独学しようとしているので、ここに Perl のようなものはありません)。単純な問題ではありませんが、私が必要とすることのほとんどを行います。個々のユーザーの crontab を検索するために Kyle の提案を使用しますが、ディレクトリ内のジョブ (in 、 などによって起動/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

ユーザーが表示され、多かれ少なかれ時間と分で並べ替えられていることに注意してください。これにより、毎日のスケジュールを確認できます。

これまでのところ、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 ; 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}"
于 2008-09-26T00:50:39.277 に答える
221

Ubuntuまたはdebianでは、crontabを表示する/var/spool/cron/crontabs/と、各ユーザーのファイルがそこにあります。もちろん、これはユーザー固有のcrontab専用です。

Redhat 6/7 および Centos の場合、crontab は の下にあり/var/spool/cron/ます。

于 2008-12-12T03:56:01.740 に答える
41

This will show all crontab entries from all users.

sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | sh | grep -v "no crontab for"
于 2015-08-07T08:56:00.357 に答える
17

Kyle Burton の回答を少し改良し、出力の書式設定を改善しました。

#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do echo $user && crontab -u $user -l
echo " "
done
于 2010-07-06T11:29:02.417 に答える
15
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 を出力します。

ただし、後でもう一度検索する必要がある場合に備えて、後で見つけることができるように、ほとんどここにドロップします。

于 2010-05-19T00:54:07.557 に答える
12

NIS を使用してクラスターをチェックする場合、ユーザーが crontab エントリを持っているかどうかを確認する唯一の方法は、Matt の回答 /var/spool/cron/tabs によるものです。

grep -v "#" -R  /var/spool/cron/tabs
于 2011-08-23T12:13:49.037 に答える
10

上記の簡単なワンライナーの答えが好きです:

$(cut -f1 -d: /etc/passwd) のユーザー用; crontab -u $user -l; を実行します。終わり

ただし、-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では、役割は/etc/passwdにもあることに注意してください(/etc/user_attrを参照)。

于 2010-05-03T17:38:33.877 に答える
9
for user in $(cut -f1 -d: /etc/passwd); 
do 
    echo $user; crontab -u $user -l; 
done
于 2012-07-12T14:57:03.183 に答える
9

以下は、crontab を持たないユーザーからコメント、空行、およびエラーを取り除きます。残っているのは、ユーザーとその仕事の明確なリストだけです。

sudo2 行目の の使用に注意してください。すでにルートになっている場合は、それを削除します。

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) で使用します。

于 2016-12-20T01:19:44.133 に答える
6

cron のバージョンによって異なります。FreeBSD で Vixie cron を使用すると、次のようなことができます。

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

もっとタブ区切りにしたい場合は、次のようにします。

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

これは、sed 置換部分のリテラル タブです。

ユーザーをループして、ユーザーごとに/etc/passwd実行する方が、システムに依存しない場合があります。crontab -l -u $user

于 2008-09-25T18:08:04.703 に答える
5

この非常に便利なスクリプトをありがとう。古いシステム (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" |

最初の egrep の変更が良いアイデアかどうかはよくわかりませんが、このスクリプトは RHEL3、4、5 および Debian5 で問題なくテストされています。お役に立てれば!

于 2009-08-07T07:56:08.970 に答える
5

すべてのユーザーリストに対して書くことができます:

sudo crontab -u userName -l

,

に行くこともできます

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

このファイルにはスケジュールがリストされます

cd /etc/cron.d/
ls -l
cat filename
于 2016-09-08T07:38:08.563 に答える
4

より良いワンライナーは以下になると思います。たとえば、NIS または LDAP にユーザーがいる場合、それらは /etc/passwd にはありません。これにより、ログインしているすべてのユーザーの crontab が表示されます。

for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
于 2016-05-19T15:40:45.780 に答える
4

yukondude に謝罪と感謝を込めて。

完璧な仕事ではありませんが、読みやすいようにタイミング設定をまとめてみました。また、「毎週金曜日」または「月曜日のみ」というものには触れません。

これはバージョン 10 です - 現在:

  • はるかに速く実行されます
  • オプションの進行文字があるため、速度をさらに向上させることができます。
  • 区切り線を使用して、ヘッダーと出力を分離します。
  • 遭遇したすべてのタイミング間隔を要約できる場合、コンパクトな形式で出力します。
  • Jan...Dec ディスクリプタの月を受け入れます
  • 曜日の Mon...Sun 記述子を受け入れます
  • 欠落している場合、anacron の debian スタイルのダミーを処理しようとします。
  • 「[ -x ... ]」を使用して実行可能性を事前にテストした後、ファイルを実行する crontab 行を処理しようとします。
  • 「command -v」を使用して実行可能性を事前テストした後、ファイルを実行する crontab 行を処理しようとします。
  • 間隔のスパンとリストを使用できます。
  • ユーザー固有の /var/spool crontab ファイルでの run-parts の使用をサポートします。

ここでスクリプト全体を公開しています。

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

于 2018-12-22T00:36:07.537 に答える
3

ファイル ( ) をループして/etc/passwdアクションを実行するだけなので、ファイル (データ ストリーム、変数) を行単位 (および/またはフィールド単位) で読み取る方法に関する適切なアプローチがありません。 )? :

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

これは、フィールド区切り文字として/etc/passwd使用して行ごとに読み取ります。:と言うと、最初のフィールドと残りのフィールドread -r user _を保持します (フィールドを無視するのはただのジャンク変数です)。$user_

crontab -uこのようにして、安全のために引用している変数を使用して呼び出すことができ$userます (スペースが含まれているとどうなるでしょうか? そのようなファイルではありそうにありませんが、決して知ることはできません)。

于 2016-07-28T08:42:54.233 に答える
1

次の小さなコマンドを使用して、単一ユーザーのすべてのジョブと、最新の bash コンソールを備えた Unix ベースのオペレーティング システム上のすべてのユーザーを一覧表示する傾向があります。

1.シングルユーザー

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

2. すべてのユーザー

for wellknownUser in $(cut -f1 -d: /etc/passwd);
   do
      echo "Jobs owned by $wellknownUser";
      crontab -l -u $wellknownUser;
      echo -e "\n";
      sleep 2;  # (optional sleep 2 seconds) while drinking a coffee
   done
于 2021-08-30T18:02:04.690 に答える
-1

私にとっては、 /var/spool/cron/crontabs を見るのが最善の方法です

于 2016-12-19T11:48:32.350 に答える
-2

このスクリプトは、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
于 2015-01-16T19:29:37.547 に答える