모든 사용자에 대한 모든 크론 작업을 어떻게 나열합니까?


857

* NIX 시스템의 스케줄 된 크론 작업을 한 번에 모두 볼 수있는 명령 또는 기존 스크립트가 있습니까? 나는뿐만 아니라, 그것은 사용자의 크론 탭을 모두 포함하려면 /etc/crontab, 그리고 무엇에 있어요 /etc/cron.d. run-parts에서 실행되는 특정 명령을 보는 것도 좋습니다 /etc/crontab.

이상적으로는 멋진 열 형태로 출력을 원하고 의미있는 방식으로 정렬하고 싶습니다.

그런 다음 여러 서버에서이 목록을 병합하여 전체 "이벤트 일정"을 볼 수 있습니다.

나는 그런 스크립트를 직접 작성하려고했지만 누군가가 이미 문제에 빠진 경우 ...


2
유닉스 SE에 대한 비슷한 질문 : unix.stackexchange.com/questions/7053/…
maxschlepzig

답변:


1134

이것을 루트로 실행해야하지만 다음을 수행하십시오.

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

crontab을 나열하는 각 사용자 이름을 반복합니다. crontab은 해당 사용자가 소유하므로 다른 사용자의 crontab은 자신이나 루트가 아닌 것을 볼 수 없습니다.


편집 당신은 크론 탭은 사용에 속해있는 사용자 알고 싶다면echo $user

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

53
사용자가 NIS 또는 LDAP에 정의되어 있으면 작동하지 않습니다. 사용해야합니다for user in $(getent passwd | cut -f1 -d: ); do echo $user; crontab -u $user -l; done
Hubert Kario

9
주석을 제외하고 '사용자 용 crontab 없음 ...'메시지를 표시하지 않도록 이것을 업데이트했습니다.for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l 2>/dev/null | grep -v '^#'; done
Jonathan

38
/ var / spool / cron의 파일을 보는 것이 쉽지 않습니까?
graywh

2
LDAP 및 / etc / passwd를 getent 명령으로 바꿔야합니다.for user in $(getent passwd | awk -F : '{print $1}'); do echo $user; crontab -u $user -l; done
Toby Batch

9
무엇에 cronjobs에 대한 /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/...?
Abdull

309

나는 스크립트를 작성하게되었다. 그것은 간단한 일이 아니지만 내가 필요한 대부분의 일을합니다. 그것은 개별 사용자의 크론 탭을 찾기위한 카일의 제안을 사용하지만, 또한 취급 /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

매일 일정을 볼 수 있도록 사용자 및 시간과 분별로 정렬됩니다.

지금까지 우분투, 데비안 및 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}"

38
아무것도 아니지만 / etc / crontab 및 /etc/cron.d/의 시스템 크론 작업에 대해서는 아무 것도하지 않았습니다. 그것들을 다루고 결국 모든 것을 형식화하는 것이 내 스크립트가하는 일입니다.
yukondude

10
yukondude-요점으로도 github에 올려 놓는 것을 고려해야합니다.
Kyle Burton

3
붙여 넣기를 복사하여 실행하려고했지만 실패했습니다. showcrons.sh : 59 행 : 예기치 않은 토큰 근처 구문 오류가 <' showcrons.sh: line 59: 완료되었습니다 <<((cut --fields = 1 --delimiter = : / etc / passwd) ''
Fraggle

2
@KyleBurton 이미 이것을 복사하는 적어도 8 개의 요지 인 것 같습니다. gist.github.com/gists/…
Zitrax

9
경고 :이 스크립트는/etc/anacrontab
ck_

191

우분투 또는 데비안에서는 crontab을 볼 수 있으며 /var/spool/cron/crontabs/각 사용자에 대한 파일이 있습니다. 그것은 물론 사용자 별 crontab에만 해당됩니다.

Redhat 6/7 및 Centos의 경우 crontab은 아래에 /var/spool/cron/있습니다.


7
이것은 RedHat (/ var / spool / cron)에서도 작동하며 계정을 관리하기 위해 Ldap과 같은 것을 사용하는 경우 특히 스크립트를 작성하거나 실행하는 것보다 쉽습니다. +1
49913

6
이것은 다른 답변보다 훨씬 도움이되었습니다. 이 방법을 사용하면 더 이상 존재하지 않는 사용자의 crontab을 볼 수 있으며 OP에서 요청한 모든 cron 작업을 제공합니다.
앤드류 엔 슬리

1
이 방법의 또 다른 이점 : 내 서버는 LDAP를 사용하므로 대부분의 사용자는에 없습니다 /etc/passwd. IMO 이것은 모든 무차별 대입 솔루션이 아니라 수용 가능한 답변이어야합니다.
Mikkel

1
Suse Linux에 적합합니다.
Bret

Thx, 이는 AWS EC2 인스턴스에도 해당됩니다.이 정보는 매우 도움이되었습니다!
Ivan Marjanovic

34

모든 사용자의 모든 crontab 항목이 표시됩니다.

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

30

리눅스 버전에 따라 다르지만 다음을 사용합니다.

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

루트로. 매우 간단하고 짧습니다.

다음과 같은 출력을 제공합니다.

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

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

4
tail -n +1 /var/spool/cron/*파일의 모든 내용을 나열하는 데 사용 합니다.
Hans Ginzel

4
... 또는 sudo sh -c 'tail -n +1 /var/spool/cron/*'루트가되고 싶지 않은 경우. OCD는 왜이 명령을 서면으로 취소 할 수 없는지 조사하도록 강요했습니다. 일반 사용자는 / var / spool / cron dir에 액세스 할 수없고 glob가 문자 그대로 별표 문자로 해석되어 존재하지 않았기 때문입니다.
데일 앤더슨

또는 cd /var/spool/cron/cron/ && grep . *모든 크론 작업 앞에 해당 사용자 이름을 인쇄합니다
Jakub Kukul


14
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이있는 사용자의 경우 사용자 이름과 crontab을 인쇄합니다.

비록 이것을 다시 검색해야 할 경우를 대비하여 나중에 찾을 수 있도록 대부분 이것을 여기에 떨어 뜨립니다.


1
에없는 LDAP 사용자도 나열합니다 /etc/passwd. 위의 Matt의 솔루션이이 특정 상황에 더 적합하지만 명령이 존재한다는 것을 아는 것이 좋습니다.
Mikkel

11

NIS를 사용하여 클러스터를 검사하는 경우 Matt의 답변 / var / spool / cron / tabs에 따라 crontab 항목이 있는지 확인하는 유일한 방법입니다.

grep -v "#" -R  /var/spool/cron/tabs

11

루트 사용자로부터 목록을 가져 오려면

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

10

이 스크립트는 CentOS에서 환경의 모든 크론을 나열하는 데 효과적이었습니다.

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

2
대박! 나는 cron 작업이 어떤 사용자인지 확인하기 위해 약간의 변형을 추가하고 결과 사이에 약간의 공간을 두었습니다. 약간 cat /etc/passwd | sed 's/^\([^:]*\):.*$/echo "\ncrontab for \1:"; sudo crontab -u \1 -l 2>\&1/' | grep -v "no crontab for" | sh의 시간 절약
jamil

9

위의 간단한 단일 라이너 답변을 좋아합니다.

$ (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 참조).



멋있는. 사용하지 않는 TIL.
squarism


7

다음은 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

우분투 (12 ~ 16)와 Red Hat (5 ~ 7)에서 이것을 사용합니다.


5

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.


4

이 매우 유용한 스크립트에 감사드립니다. 오래된 시스템 (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에서 테스트되었습니다. 도움이 되었기를 바랍니다!


3

@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    

3
하지 당신이해야 grep -v '^#매직 넘버에 의존하는 '대신에 11?
rr-

1
Red Hat / CentOS 배포판은 사용자의 crontab을 시작할 때 유용한 힌트를 쓰지 않으므로 처음 11 줄을 잘라 내면 내용이 없어집니다. 우분투 사용자가 자신의 crontab을 편집하고 모든 손을 removed 경우에도 마찬가지입니다.
데일 앤더슨


3

더 나은 라이너 하나가 아래에 있다고 생각합니다. 예를 들어 NIS 또는 LDAP에 사용자가있는 경우 / etc / passwd에 없습니다. 로그인 한 모든 사용자의 crontab을 제공합니다.

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


3

모든 사용자 목록에 쓸 수 있습니다.

sudo crontab -u userName -l

,

당신은 또한 갈 수 있습니다

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

이 파일은 일정을 나열합니다

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

3

사과와 yukondude에 감사합니다.

완벽한 작업이 아니지만 읽기 쉬운 타이밍 설정을 요약하려고 시도했지만 '매주 금요일'또는 '월요일에만'항목을 건드리지 않습니다.

이것은 버전 10입니다-지금 :

  • 훨씬 빠르게 실행
  • 선택적 진행 문자가 있으므로 속도를 더욱 향상시킬 수 있습니다.
  • 구분선을 사용하여 헤더와 출력을 구분합니다.
  • 계산 된 모든 타이밍 간격을 요약 할 수있는 경우 컴팩트 형식으로 출력됩니다.
  • 1 월 ... 12 월 설명자 수용
  • 요일에 Mon ... Sun 설명자를 허용합니다.
  • anacron이 없을 때 데비안 스타일의 더미 처리를 시도합니다.
  • "[-x ...]"를 사용하여 실행 성을 사전 테스트 한 후 파일을 실행하는 crontab 행을 처리하려고합니다.
  • "command -v"를 사용하여 실행 가능성을 사전 테스트 한 후 파일을 실행하는 crontab 행을 처리하려고합니다.
  • 간격 범위 및 목록을 사용할 수 있습니다.
  • 사용자 별 / var / spool crontab 파일에서 실행 부분 사용을 지원합니다.

나는 지금 여기에 전체 스크립트를 게시하고 있습니다.

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


2

파일 ( /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있습니다 (공백이 포함되어 있으면 어떻게 될까요? 그러한 파일에는 없을 수 있지만 알 수는 없습니다).


1

Solaris에서 알려진 특정 사용자 이름의 경우 :

crontab -l username

다른 모든 * Nix에는 -u수정자가 필요합니다 .

crontab -u username -l

위의 다른 게시물과 마찬가지로 Solaris에서 모든 사용자의 작업을 한 번에 얻으려면 다음을 수행하십시오.

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

-1

나를 위해 / var / spool / cron / crontabs가 가장 좋은 방법입니다.


2
이 전에 답변되었습니다
bummi

-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

//, RobFrost, 여기에 작성된이 스크립트가 일관되게 작동합니까?
Nathan Basanese 2016 년

"for"가있는 행을 읽지 않는 이유를 참조하십시오 . 또한,이 게시물을 게시하기 전에 여러 번 답변되었습니다.
fedorqui 'SO 그만 해'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.