일부 동료는 크론 작업을 추가하여 작업을 수행하되 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/crontab
crontab -e
그런 다음 .
셸에 인수로 명명된 스크립트를 읽고 실행하라고 지시합니다.현재 쉘에서( 일부 쉘에서 호출되는 source
별칭 .
) 스크립트를 별도의 프로그램으로 실행할 때와 달리 모든 함수 정의 및 변수 할당은 이후에 표시됩니다.
선
0 1 * * * . /path/to/some/file.bash
cron에 의해 시작되는 쉘이 .../file.bash
동일한 쉘에서 실행되도록 지시합니다. 점 없이 명령을 실행하는 대신 왜 이 작업을 권장하는지 잘 모르겠습니다. 새 셸을 초기화할 필요가 없다는 것은 약간의 최적화일 수 있지만 스크립트가 cron 시작 셸에서 실행되어야 한다는 단점이 있습니다. cron이 일반 sh를 시작하지만 스크립트는 zsh 또는 Python용인 경우에는 작동하지 않습니다.
이 줄이 전역 crontab에 있으면 /path/to/some/file.bash
user 로 실행된다는 의미입니다 .
. 아마도 그런 의미는 아닐 것입니다.
단순화를 위해 다음을 권장합니다(스크립트를 실행 가능하게 만들고 아직 수행하지 않은 경우 적절한 해시뱅 행을 추가한 후).
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 데몬에서 이 오류 메시지를 볼 수 있을 것입니다.