Jak wyświetlić listę wszystkich zadań cron dla wszystkich użytkowników?

Czy istnieje polecenie lub istniejący skrypt, który pozwoli mi na przeglądanie wszystkich zaplanowanych zadań cron systemu * NIX na raz? Chciałbym, aby zawierał wszystkie crontaby użytkownika, a także /etc/crontab i cokolwiek jest w /etc/cron.d. Byłoby również miło zobaczyć konkretne polecenia uruchamiane przez run-parts w /etc/crontab.

Idealnie, chciałbym, aby wyjście w ładnej formie kolumny i uporządkowane w jakiś sensowny sposób.

Mógłbym następnie połączyć te oferty z wielu serwerów, aby wyświetlić ogólny " harmonogram wydarzenia."

Sam miałem napisać taki scenariusz, ale jeśli ktoś już zadał sobie trud...
 742
Author: yukondude, 2008-09-25

22 answers

Trzeba by to uruchomić jako root, ale:

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

Zostanie zapętlona nad każdą nazwą użytkownika wypisującą ich tabelę crontab. Crontaby są własnością odpowiednich użytkowników, więc nie będziesz mógł zobaczyć crontabu innego użytkownika bez ich lub roota.


Edytuj jeśli chcesz wiedzieć, do którego użytkownika należy crontab, użyj echo $user

for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
 994
Author: Kyle Burton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-17 15:07:39

Skończyłem pisząc skrypt(staram się nauczyć się bardziej precyzyjnego pisania skryptów bash, dlatego nie widzisz tu czegoś takiego jak Perl). To nie jest prosta sprawa, ale robi większość tego, czego potrzebuję. Wykorzystuje sugestie Kyle ' a do wyszukiwania crontabów poszczególnych użytkowników, ale także zajmuje się /etc/crontab (w tym skryptami uruchomionymi przez run-parts w /etc/cron.hourly, /etc/cron.daily, itd.) oraz zadania w katalogu /etc/cron.d. Bierze wszystkie z nich i łączy je w wyświetlacz coś w rodzaju po:

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

Zauważ, że pokazuje użytkownika i mniej więcej sortuje według godzin i minut, dzięki czemu mogę zobaczyć dzienny harmonogram.

Do tej pory testowałem go na Ubuntu, Debianie i 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}"
 286
Author: yukondude,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 17:50:23

W systemie Ubuntu lub debian, możesz przeglądać crontab według /var/spool/cron/crontabs/, a następnie plik dla każdego użytkownika jest tam. To oczywiście tylko dla crontabów specyficznych dla użytkownika.

 156
Author: Hubert Kario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-11 21:31:17

Spowoduje wyświetlenie wszystkich wpisów crontab od wszystkich użytkowników.

sed 's/^\([^:]*\):.*$/crontab -u \1 -l 2>\&1/' /etc/passwd | grep -v "no crontab for" | sh
 29
Author: idranoels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 10:36:28

Zależy od wersji Linuksa ale ja używam:

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

Jako root. Bardzo proste i bardzo krótkie.

Daje mi wyjście typu:

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

==> /var/spool/cron/my_user <==
*/10 1 * * * /path/to/script
 27
Author: Jørgen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-03 00:40:46

Małe udoskonalenie odpowiedzi Kyle ' a Burtona z ulepszonym formatowaniem wyjścia:

#!/bin/bash
for user in $(cut -f1 -d: /etc/passwd)
do echo $user && crontab -u $user -l
echo " "
done
 14
Author: sum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-12 15:04:17
getent passwd | cut -d: -f1 | perl -e'while(<>){chomp;$l = `crontab -u $_ -l 2>/dev/null`;print "$_\n$l\n" if $l}'

Pozwala to uniknąć bezpośredniego mieszania z passwd, pomija użytkowników, którzy nie mają wpisów crona, a dla tych, którzy je mają, wypisuje nazwę Użytkownika oraz ich tabelę crontab.

Głównie upuszczam to tutaj, więc mogę go znaleźć później, na wypadek, gdybym musiał go ponownie poszukać.

 13
Author: Mithaldu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 00:54:07

Jeśli sprawdzisz klaster używając NIS, jedynym sposobem, aby sprawdzić, czy użytkownik ma wpis crontab jest odpowiedź Matta / var/spool/cron / tabs.

grep -v "#" -R  /var/spool/cron/tabs
 10
Author: Doris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 16:16:38

Podoba mi się prosta, jednowierszowa odpowiedź powyżej:

Dla użytkownika w $(cut-f1-d: /etc/passwd); do crontab-u $user-l; done

Ale Solaris, który nie ma flagi-u i nie wypisuje sprawdzanego użytkownika, można go zmodyfikować w ten sposób:

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

Otrzymasz listę użytkowników bez błędów rzucanych przez crontab, gdy konto nie może korzystać z cron itp. Należy pamiętać, że w Solarisie role mogą być również w /etc / passwd (zobacz /etc/user_attr).

 8
Author: squarism,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-03 17:38:33

Ten skrypt pracował dla mnie w CentOS, aby wymienić wszystkie crony w środowisku:

sudo cat /etc/passwd | sed 's/^\([^:]*\):.*$/sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh
 8
Author: Sam T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 06:37:48
for user in $(cut -f1 -d: /etc/passwd); 
do 
    echo $user; crontab -u $user -l; 
done
 7
Author: indra bhushan kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 17:08:54

Zależy od twojej wersji crona. Używając Vixie cron na FreeBSD mogę zrobić coś takiego:

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

Jeśli chcę, aby było bardziej rozdzielone tabulatorami, mogę zrobić coś takiego:

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

Gdzie jest to literalna zakładka w części zastępczej sed.

Może być bardziej niezależne od systemu, aby pętla przez użytkowników w /etc/passwd i zrobić crontab -l -u $user dla każdego z nich.

 4
Author: Daniel Papasian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-15 04:40:45

Poniższe usuwa komentarze, puste wiersze i błędy użytkowników bez tabeli crontab. Wszystko, co ci pozostaje, to przejrzysta Lista użytkowników i ich zadań.

Zwróć uwagę na użycie sudo w drugiej linii. Jeśli jesteś już root, usuń to.

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

Przykładowe wyjście:

# ------ 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
Używam tego na Ubuntu (od 12 do 16) i Red Hat (od 5 do 7).
 4
Author: Dale Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-20 01:19:44

Dzięki za ten bardzo przydatny skrypt. Miałem małe problemy z uruchomieniem go na starych systemach (Red Hat Enterprise 3, które obsługują inaczej egrep i tabs w ciągach), i innych systemach z niczym w /etc / cron.d / (skrypt zakończył się wtedy błędem). Oto patch, który sprawi, że będzie działał w takich przypadkach:

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" |

Nie jestem pewien, czy zmiany w pierwszym egrepie są dobrym pomysłem, ale cóż, ten skrypt został przetestowany na RHEL3,4,5 i Debian5 bez żadnego problemu. Hope this pomaga!

 3
Author: jbbarth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-07 07:56:08

Building on top of @ Kyle

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

Aby uniknąć komentarzy zwykle na górze /etc / passwd,

I na macosx

for user in $(dscl . -list /users | cut -f1 -d:); do echo $user; crontab -u $user -l; done    
 2
Author: Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-26 15:09:14

Myślę, że lepszy liner byłby poniżej. Na przykład, jeśli masz użytkowników w NIS lub LDAP, nie będą oni w /etc / passwd. To da ci crontaby każdego użytkownika, który się zalogował.

for I in `lastlog | grep -v Never | cut -f1 -d' '`; do echo $I ; crontab -l -u $I ; done
 2
Author: Monte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 16:12:45

Możesz napisać dla wszystkich użytkowników:

sudo crontab -u userName -l

,

Możesz również przejść do

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

Ten plik wyświetli listę rozkładów

cd /etc/cron.d/
ls -l
cat filename
 2
Author: rkoots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-08 09:46:30

Ponieważ jest to kwestia zapętlenia pliku (/etc/passwd) i wykonania akcji, brakuje mi odpowiedniego podejścia do Jak mogę odczytać plik (strumień danych, zmienna) linia po linii (i/lub pole po polu)?:

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

Odczytuje /etc/passwd linia po linii używając : jako ogranicznika pola. Mówiąc read -r user _, sprawiamy, że $user przytrzymuje pierwsze pole, a _ resztę (ignorowanie pól jest tylko zmienną-śmieciem).

W ten sposób możemy wywołać crontab -u używając zmiennej $user, która cytujemy dla bezpieczeństwa (co jeśli zawiera spacje? Jest to mało prawdopodobne w takim pliku, ale nigdy nie wiadomo).

 1
Author: fedorqui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-28 08:42:54

Aby pobrać listę od użytkownika ROOT.

for user in $(cut -f1 -d: /etc/passwd); do echo $user; sudo crontab -u $user -l; done
 1
Author: Sheikh Abdul Wahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-28 07:36:21

Na Solarisie, dla konkretnej znanej nazwy użytkownika:

crontab -l username

Wszystkie inne * Nix będą potrzebować -u modyfikatora:

crontab -u username -l

Aby uzyskać wszystkie zadania użytkownika naraz na Solarisie, podobnie jak inne posty powyżej:

for user in $(cut -f1 -d: /etc/passwd); do crontab -l $user 2>/dev/null; done
 1
Author: armagedescu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-15 17:44:03

Dla mnie najlepszy jest / var / spool/cron / crontabs]}

 -1
Author: Nic0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 11:48:32

Ten skrypt wysyła plik Crontab do pliku, a także wyświetla listę wszystkich użytkowników potwierdzających tych, którzy nie mają wpisu 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
 -2
Author: Rob Frost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-09 08:50:42