cron에서 sh 스크립트 실행

cron에서 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

내가 뭘 잘못했나요? 감사해요

답변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에서 입력하지 않은 명령이 작동하지 않는 일반적인 이유는 다음과 같습니다(일반적인 이유 순서대로).

  1. Cron은 제한된 환경, 즉 최소한을 제공하며 $PATH다른 예상 변수가 부족합니다.
  2. Cron은 기본적으로 /bin/sh를 호출하지만 대화식으로 다른 쉘을 사용할 수도 있습니다.
  3. Cron은 % 문자를 특별히 처리합니다(명령에서 개행 문자가 됩니다).
  4. Cron은 터미널이나 그래픽 환경을 제공하지 않습니다.

작업에서 오류 메시지를 포함한 출력이 생성되면 cron은 전체 출력이 포함된 이메일을 보냅니다. 현지에서 받은 메일을 꼭 읽어보시거나, 읽은 주소로 전달해 주시기 바랍니다. 로컬 계정에서 다른 주소로 메일을 전달하려면 다른 주소를 입력하세요.~/.forward. 크론 작업이 시스템 사용자( root, , ...)로 실행 중인 경우 대부분의 메일 설정에 대해 사용자의 메일이 webmaster귀하 (및 다른 관리자)에게 리디렉션되는지 확인하십시오 root: elzo./etc/aliases.

답변3

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

/usr/bin 또는 /bin에서 명령을 사용할 수 없을 수 있으므로 phpcron을 통해 실행하면 스크립트가 실패하고 실행되지 않으면 성공적으로 실행됩니다.

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

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

관련 정보