crontab 항목에 7개의 항목이 있다는 것은 무엇을 의미합니까?

crontab 항목에 7개의 항목이 있다는 것은 무엇을 의미합니까?

일부 동료는 크론 작업을 추가하여 작업을 수행하되 crontab -e다음 줄을 실행하고 추가할 것을 제안했습니다.

 0 1 * * * . /path/to/some/file.bash

이 기능이 작동하는지 확인하기 위해 다음으로 변경했습니다.

 0 1 * * * . /path/to/some/file.bash && date >> /some/log

/some/log이렇게 하면 매일 더 이상 줄이 없는지 확인할 수 있습니다 .

하지만 그런 일은 일어나지 않았습니다.

디버깅 목적으로 다음 세 줄을 에 추가했습니다 crontab -e.

 * * * * * echo "uffa" >> /home/me/without-user
 * * * * * me echo "uffa" >> /home/me/with-user
 * * * * * . echo "uffa" >> /home/me/with-any-user

내 사용자 이름은 어디에 있습니까 me? 그러면 세 개의 파일이 모두 생성되지만, 8분 후에 수행한 확인에서 볼 수 있듯이 첫 번째 파일만 1분마다 한 줄씩 증가합니다.

$ for f in ~/with*; do echo ''; echo $f; cat $f; done

/home/emdeange/with-any-user

/home/emdeange/without-user
uffa
uffa
uffa
uffa
uffa
uffa
uffa
uffa

/home/emdeange/with-user

무슨 일이에요? 줄에 추가 항목이 있기 때문에 줄 2와 3이 잘못된 구문을 사용하고 있습니까? 그렇다면 파일은 왜 생성된 것일까요?


방금 이와 같은 말도 안되는 명령을 실행하면 다음 두 줄을 알려주는 jflkdasjflaksd > someFile빈 가 생성된다는 것을 확인했습니다.someFile

 * * * * * me echo "uffa" >> /home/me/with-user
 * * * * * . echo "uffa" >> /home/me/with-any-user

단지 잘못된 것이며 쉘 명령줄 처리가 작동하는 방식으로 인해 오류가 발생하기 전에 파일이 생성됩니다.

그러나 이는 다른 사람들에게 유용할 수 있는 라인입니다. 뭐가 문제 야?

답변1

좋아요, 우선 약간 다른 두 crontab가지 형식이 있습니다. 하나는 사용자별 crontab용이고 다른 하나는 시스템 crontab( /etc/crontab및 그 안의 파일 /etc/cron.d/)용입니다.

개인용 crontab에는 시간과 날짜를 입력하는 5개의 필드가 있고 나머지는 명령을 입력하는 필드가 있습니다. 시스템 crontab에는 5개의 시간 및 날짜 필드가 있습니다.여섯 번째는 사용자가 명령을 실행하는 것입니다., 나머지 명령. 총 6개와 7개입니다. 명령의 마지막 "필드"는 다른 필드와 약간 다르게 정의됩니다.

개인용 crontab에는 사용자 이름 필드가 없습니다. crontab은 소유자가 누구인지 암시하고 일반 사용자는 다른 사람처럼 프로그램을 실행할 수 없기 때문입니다.

(댓글에서 지적했듯이 사용자의 개인 크론탭도 다른 사용자와 마찬가지로 개인 크론탭일 뿐입니다. 다른 면에서는 조금 특별 root하지만 사용자 이름 필드가 없습니다 . 따라서 사용자의 개인 크론탭과 동일 할 뿐만 아니라 루트로 얻는 것 , 다른 형식도 있습니다).root/etc/crontabcrontab -e


그런 다음 .셸에 인수로 명명된 스크립트를 읽고 실행하라고 지시합니다.현재 쉘에서( 일부 쉘에서 호출되는 source별칭 .) 스크립트를 별도의 프로그램으로 실행할 때와 달리 모든 함수 정의 및 변수 할당은 이후에 표시됩니다.

0 1 * * * . /path/to/some/file.bash

cron에 의해 시작되는 쉘이 .../file.bash동일한 쉘에서 실행되도록 지시합니다. 점 없이 명령을 실행하는 대신 왜 이 작업을 권장하는지 잘 모르겠습니다. 새 셸을 초기화할 필요가 없다는 것은 약간의 최적화일 수 있지만 스크립트가 cron 시작 셸에서 실행되어야 한다는 단점이 있습니다. cron이 일반 sh를 시작하지만 스크립트는 zsh 또는 Python용인 경우에는 작동하지 않습니다.

이 줄이 전역 crontab에 있으면 /path/to/some/file.bashuser 로 실행된다는 의미입니다 .. 아마도 그런 의미는 아닐 것입니다.

단순화를 위해 다음을 권장합니다(스크립트를 실행 가능하게 만들고 아직 수행하지 않은 경우 적절한 해시뱅 행을 추가한 후).

0 1 * * * /path/to/some/file.bash

그런 다음 . /some/script && date >> logfile그래도 작동하지 않으면 먼저 스크립트가 오류와 함께 종료되는지 확인하세요. &&여기서는 왼쪽 명령이 성공적으로 종료된 경우에만 오른쪽 명령을 실행하도록 쉘에 지시하는 연산자를 사용했습니다 . . /some/script; date >> logfile무조건 실행 하시면 됩니다 . 또는 . /some/script; printf "run at %s, exit status %d\n" "$(date)" "$?" >> logfile종료 상태를 저장해 볼 수도 있습니다.


이것들에 관해서는:

* * * * * echo "uffa" >> /home/me/without-user
* * * * * me echo "uffa" >> /home/me/with-user
* * * * * . echo "uffa" >> /home/me/with-any-user

개인용 crontab에서 첫 번째는 셸에 를 실행하라고 지시하고 echo, 두 번째는 셸에 이라는 명령을 실행하라고 지시하고 me, 세 번째는 셸에 이라는 스크립트를 실행하라고 지시합니다 echo. 이들 모두에는 리디렉션이 포함되어 있으며 명령이 시작되기 전에 리디렉션이 셸에서 처리되므로 모든 경우에 파일이 생성됩니다. (쉘은 명령을 시도하기 전에 명령이 실행 가능한지 여부를 알 수 없고, 성공하면 제어가 명령에 전달되므로 쉘은 더 이상 리디렉션을 통해 아무 것도 할 수 없기 때문에 이런 방식이어야 합니다.)

후자 두 개는 오류 메시지를 표시할 수 있으며, 크론이 올바르게 설정된 경우 이메일로 오류 메시지를 받게 됩니다.


그러나 이는 다른 사람들에게 유용할 수 있는 라인입니다. 뭐가 문제 야?

위에서 언급한 것처럼 . /path/to/some/script셸에서 지정된 스크립트를 실행하려고 하면 바이너리 명령에 실패하므로 . echo ...작동할 가능성이 없습니다. 0 1 * * * username echo ...이는 전역 crontab에서는 작동할 수 있지만 개인 crontab에서는 작동하지 않을 수 있습니다. 유효한 사용자 이름이 아닐 수 있으므로 0 1 * * * . whatever전 세계적으로 작동할 가능성이 없습니다 ..

답변2

사용자 이름이 없는 첫 번째 줄은 사용자가 소유한 crontab의 구문입니다.

min hour dayofmonth month dayofweek command ...

두 번째 줄(사용자 이름 포함)의 구문은 다음과 같습니다 /etc/crontab.

min hour dayofmonth month dayofweek username command ...

세 번째 줄이 잘못되었습니다. 기술적으로 "dot" 명령은 "echo"라는 파일에서 스크립트를 가져와 "uffa"를 매개변수로 설정합니다.스크립트echo내 시스템 에는바이너리 /usr/bin/echo그것을 얻으려고 하면 오류가 발생합니다.

...$ LANG=C . echo
bash: .: /usr/bin/echo: cannot execute binary file

시스템 로그를 보면 cron 데몬에서 이 오류 메시지를 볼 수 있을 것입니다.

관련 정보