크론에서 sh 스크립트 실행


12

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

내가 뭘 잘못 했니? 감사


"작동하지 않습니다"가 작동하지 않습니다. 보다? 당신은 내가 무슨 뜻인지 알지 못하며, 마찬가지로 우리는 당신이 무엇을 의미하는지 모릅니다. 내 말은 (예) 무엇을 작동하지? 무엇이든 될 수 있습니다. tmow의 추측은 정확할 수 있지만, 그것은 단지 추측 일뿐입니다.
Jürgen A. Erhard

그렇습니다. 결과에 대해보다 구체적으로 설명 할 수 있다면 문제가 무엇인지 더 잘 판단 할 수 있습니다. 즉, "작동하지 않는다"는 것은 무엇을 의미합니까 (:
gabe.

syslog에 로그가 표시되지 않으며 스크립트는 발생하지 않는 db에 일부 삽입 작업을 수행하며 스크립트를 직접 실행하면 발생합니다.
Elzo Valugi

답변:


15

그 남자에 따르면 :

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'에 대한 전체 경로를 사용해야하는 것을 막을 수 있습니다.
...


나쁜 $ PATH는 수동으로 작동하지만 cron에서는 작동하지 않는 스크립트의 가장 일반적인 원인입니다.
Patrick

@Patrick 물론 cron이 PHP의 위치를 ​​모르는 경우 문제가 발생합니다. 그렇지 않으면 Elzo crontab이 아무런 문제없이 작동하므로 PATH 문제 여야합니다.
tmow

답변 주셔서 감사합니다. 그것은 매우 쉽게 나를 위해 일했다 !!! .. 많은 @tmow 감사합니다.
Vignesh Prajapati

5

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

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

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


2

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.