저는 "Hello World"를 /tmp/example.txt
.
스크린샷에서 볼 수 있듯이 저는 다음을 시도했습니다.
28 23 * * * echo "Hello World" >> /tmp/example.txt
28 23 * * * root /bin/bash echo "Hello World" >> /tmp/example.txt
또한 스크린샷에서 볼 수 있듯이날짜. 나는 또한 얻으려고 노력했다.정확한 날짜cron 작업(예: 28 23 29 11 4)에서 이 방법도 작동하지 않습니다.
저도 실제 파일을 사용해 보았는데요
28 23 * * * ./pingstuff
이것평평한 것파일을 Google에 ping하면 됩니다. 이 파일을 실행할 수 있으며 올바르게 실행됩니다. 그런데 crontab -e에서 사용하려고 하면 예정된 시간에 아무 일도 일어나지 않습니다. (시도할 때마다 시간이 그에 따라 변경됩니다.)
저는 슈퍼유저로 로그인했습니다. 이 모든 파일을 읽고, 쓰고, 실행할 수 있는 권한이 있습니다. 내가 뭘 잘못하고 있는지 잘 모르겠습니다.
답변1
cronjob이 실행되지 않을 수 있는 이유는 다음과 같습니다.
- cron 데몬이 실행되고 있지 않습니다
- crontab의 구문 오류
- 명령에 구문 오류가 있습니다.
- 또는 권한 문제가 있습니다(예: 실행 비트가 설정되지 않음)
데몬이 실행 중인지 확인하려면 service cron status
또는 systemctl status cron
(서비스 관리자는 배포판에 따라 다름)을 시도하십시오. 데몬의 이름은 crond
또는 와 같이 약간 다를 수도 있습니다 cronie
.
실행 중이 아니면 시작합니다( status
로 대체 start
).
실행 중인 경우 관련 로그 파일을 계속 확인하여 작업이 실제로 실행 중인지 확인하세요. 배포판에 따라 이는 와 같은 데몬 관련 파일 /var/log/syslog
이나 시스템 바이너리 로그 파일( 보기용)에 기록될 수 있습니다. 각 작업 실행에 대한 행이 표시되어야 합니다./var/log/messages
/var/log/cron
journalctl -u cron
crontab을 테스트할 때 실행 시간을 설정하세요.더다음 분 안에. 일부 cron 구현은 실행할 작업을 "사전 계획"합니다. 즉, 12:34:00에 실행할 작업을 12:33:00에 결정하므로 34 12 …
12:33:00에 cronjob을 추가하면 다음을 놓칠 수 있습니다. 기회의 창: 30.
/bin/sh
작업이 실행되지만 예상한 결과가 생성되지 않는 경우 동일한 셸(일반적으로 미니멀리스트)을 사용하여 동일한 사용자로 crontab에서 명령을 수동으로 실행해 보세요.
일반적인 함정(여기서는 그렇지 않지만)은 명령의 문자에 있습니다 . 문자는 cron에 의해 특별히 처리되며 실제 명령 호출에서 표시되도록 하려면 %
이스케이프( )해야 합니다 . 대부분의 cron 구현에서는 각 cronjob(있는 경우)의 출력도 이메일로 보냅니다. 인터넷을 통한 메일 배달을 설정하지 않은 경우 이러한 메시지를 로컬에 저장하고 이 명령을 사용하여 읽어야 합니다.\%
mail
답변2
가장 큰 문제는 이것이 /bin/bash echo "Hello World"
유효한 명령이 아니라는 것입니다. 라는 스크립트를 찾습니다 echo
. 시도 /bin/bash -c 'echo "Hello World"'
해봐.
두 번째 문제는 pingstuff
.
내 관심을 끈 세 번째 문제는 해당 문제가 /tmp/example.txt
이미 존재한다는 것입니다( cat
명령에 대한 오류 메시지가 표시되지 않습니다). 쓰기 권한이 있습니까? (물론, 루트로 실행하는 경우에는 문제가 되지 않습니다.)
당신은 또한 볼 수 있습니다Ubuntu 14.04, 16.04, 18.04 Cron 작업이 실행되지 않습니다., 관련이 없을 수도 있습니다.
답변3
다양한 crontab 파일에는 두 가지 crontab 구문이 있습니다. 첫 번째 형태:
28 23 * * * echo "Hello World" >> /tmp/example.txt
사용자 crontab에 적용됩니다. 이는 를 사용하여 편집됩니다 crontab -e
.
두 번째 형태:
28 23 * * * root /bin/bash echo "Hello World" >> /tmp/example.txt
시스템 전체의 crontab 파일에 대한 추가 사용자 열이 있습니다 /etc/crontab
. 따라서 edit crontab file 을 사용하고 있으므로 crontab -e
여섯 번째 필드에 사용자 이름을 지정하면 안 됩니다.
cron
명령을 실행할 때 루트이기 때문에 명령을 루트로 실행해야 한다는 것을 알게 되며 crontab -e
, 여섯 번째 필드에 "root"를 입력하면
cron
이름이 지정된 프로그램을 실행하려고 시도합니다 root
.
그러나 cron은 셸에서 명령을 실행한다는 점에 유의하세요. 또한 두 번째 예에서는 셸을 명시적으로 시작합니다. 대화형 셸에서 명령을 사용해 보셨나요?
$ /bin/bash echo hello
/usr/bin/echo: /usr/bin/echo: cannot execute binary file
제대로 테스트하려면 Hello World Shell 스크립트를 사용할 수 있습니다.
#!/bin/bash
echo 'Hello, world!'
리디렉션은 스크립트(단지 스타일 가이드)가 아닌 crontab에서 수행되어야 합니다.
임의의 디렉토리에 저장하고 helloworld.sh
실행 가능하게 만들고( chmod +x helloworld.sh
) crontab에서 이 스크립트를 호출하십시오. 사용자 crontab이나 시스템 전체 crontab을 사용하는 경우 주의하십시오.
따라서 사용자의 crontab() 항목은 crontab -e
다음과 같아야 합니다.
28 23 * * * /path/to/helloworld.sh >> /tmp/example.txt