test.sh 스크립트가 있습니다
#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh
명령줄에서 루트로 파일을 실행하면 작동합니다.
sh /home/v/test.sh
crontab -e(루트 cron)로 설정하면 작동하지 않습니다.
* * * * * sh /home/v/test.sh
내가 뭘 잘못했나요? 감사해요
답변1
그 남자에 따르면 :
cron 데몬은 HOME 디렉터리에서 하위 쉘을 시작합니다. 로그인하지 않은 상태에서 명령을 실행할 계획이고 .profile 파일에서 명령을 실행하려면 명령이 .profile 파일을 명시적으로 읽어야 합니다.
cron 데몬은 HOME, LOGNAME, SHELL(=/usr/bin/sh) 및
PATH(=/usr/bin)를 정의하여 각 셸에 대한 기본 환경을 제공합니다.
따라서 cron 데몬은 php가 어디에 있는지 알지 못합니다. 예를 들어 전체 php 경로를 수동으로 지정해야 합니다(실제 PHP 경로는 모릅니다).
#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh
또 다른 방법은 다음과 같이 /etc/profile(또는 .profile/.bashrc)을 얻는 것입니다.
* * * * * . /home/v/.bashrc ; sh /home/v/test.sh
.bashrc가 필요한 환경 변수(예: PATH)를 설정하는 경우 유용합니다.
편집하다
흥미로운 읽기는 "초보자: cron 소개”, 제목에 있는 기사를 과소평가하지 마십시오(모든 사람이 읽을 수 있는 기사입니다). 사실 이 기사는 잘 작성되었으며, 귀하의 질문에 완벽하게 답변해 줍니다.
...
PATH에는 cron 검색 경로에 있을 디렉터리가 포함되어 있습니다. 예를 들어 /usr/cog/bin 디렉터리에 "foo" 프로그램이 있는 경우 경로에 /usr/cog/bin을 추가하는 것이 좋습니다. 호출할 때마다 "foo"에 대한 전체 경로를 사용하지 않아도 됩니다.
...
답변2
터미널에 명령을 입력했지만 cron에서 입력하지 않은 명령이 작동하지 않는 일반적인 이유는 다음과 같습니다(일반적인 이유 순서대로).
- Cron은 제한된 환경, 즉 최소한을 제공하며
$PATH
다른 예상 변수가 부족합니다. - Cron은 기본적으로 /bin/sh를 호출하지만 대화식으로 다른 쉘을 사용할 수도 있습니다.
- Cron은 % 문자를 특별히 처리합니다(명령에서 개행 문자가 됩니다).
- Cron은 터미널이나 그래픽 환경을 제공하지 않습니다.
작업에서 오류 메시지를 포함한 출력이 생성되면 cron은 전체 출력이 포함된 이메일을 보냅니다. 현지에서 받은 메일을 꼭 읽어보시거나, 읽은 주소로 전달해 주시기 바랍니다. 로컬 계정에서 다른 주소로 메일을 전달하려면 다른 주소를 입력하세요.~/.forward
. 크론 작업이 시스템 사용자( root
, , ...)로 실행 중인 경우 대부분의 메일 설정에 대해 사용자의 메일이 webmaster
귀하 (및 다른 관리자)에게 리디렉션되는지 확인하십시오 root: elzo
./etc/aliases
.
답변3
cron 데몬은 일반적으로 PATH 환경 변수가 /usr/bin:/bin과 같은 일부 시스템 기본값으로 제한되는 쉘에서 명령을 실행합니다.
/usr/bin 또는 /bin에서 명령을 사용할 수 없을 수 있으므로 php
cron을 통해 실행하면 스크립트가 실패하고 실행되지 않으면 성공적으로 실행됩니다.
Cron은 일반적으로 작업이 완료된 후(즉, 명령이 종료 상태 != 0을 반환하거나 stdout/stderr에 출력을 생성하는 경우) 이메일을 통해 루트에 오류나 작업 메시지를 보고합니다.
시스템에 따라 이러한 메시지를 받으려면 로컬 메일 배달을 설정해야 합니다.