크론에서 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.