[unix] 크론에서 sh 스크립트 실행

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

내가 뭘 잘못 했니? 감사



답변

그 남자에 따르면 :

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)를 설정 한 경우 유용합니다

편집하다

흥미로운 내용은 ” Newbie : Intro to cron “입니다. 제목의 기사를 과소 평가하지 마십시오 (모든 사람이 읽을 수있는 내용).


PATH에는 cron의 검색 경로에있는 디렉토리가 포함되어 있습니다. 예를 들어, / usr / cog / bin 디렉토리에 ‘foo’프로그램이 있으면 / usr / cog / bin을 호출 할 때마다 ‘foo’에 대한 전체 경로를 사용해야하는 것을 막을 수 있습니다.


답변

터미널에 입력 할 때 명령이 작동하는 일반적인 원인은 다음과 같습니다. cron에서는 그렇지 않습니다.

  1. Cron은 제한된 환경 (예 : 최소 $PATH및 기타 예상 변수 누락)을 제공합니다.
  2. Cron은 기본적으로 / bin / sh를 호출하지만 다른 쉘을 대화식으로 사용하고있을 수 있습니다.
  3. Cron은 % 문자를 특수하게 취급합니다 (명령에서 개행 문자로 바)).
  4. Cron은 터미널 또는 그래픽 환경을 제공하지 않습니다.

작업이 오류 메시지를 포함하여 출력을 생성하면 cron은 전체 출력이 포함 된 이메일을 보냅니다. 로컬로받은 메일을 읽거나 읽은 주소로 전달하십시오. 로컬 계정에서 다른 주소로 메일을 전달하려면 다른 주소를에 입력하십시오 ~/.forward. cron 작업이 시스템 사용자 ( root,, webmaster…) 로 실행중인 경우 사용자의 메일이 사용자 (및 다른 관리자)에게 경로 재 지정되도록하십시오. 대부분의 메일 설정으로, 같은 라인을 넣어 root: elzo에서 /etc/aliases.


답변

cron 데몬은 일반적으로 PATH 환경 변수가 일부 시스템 기본값 (예 : / usr / bin : / bin)으로 제한되는 쉘에서 명령을 실행합니다.

아마도 php/ usr / bin 또는 / bin에서 명령을 사용할 수 없으므로 cron을 통해 스크립트를 실행할 때 스크립트가 실패하고 실패하면 성공적으로 실행됩니다.

Cron은 일반적으로 작업이 완료된 후 메일을 통해 오류 또는 작업 메시지를 루트 사용자에게보고합니다 (예 : 명령이 종료 상태! = 0을 리턴하거나 stdout / stderr에 출력을 생성하는 경우).

시스템에 따라 이러한 메시지를 받으려면 로컬 메일 배달을 설정해야합니다.


답변