2017-12-18 11 views
1

호출 할 때 나는 크론이 운영하는 쉘 파일이 작동하지 않습니다PHP 시스템() 호출 쉘

파일이 바로이 라인이 포함되어 있는지
* * * * * /bin/sh /var/www/test.sh > /dev/null 2>&1 

:

php -q /var/www/test.php 

즉, PHP는 파일이 포함되어 있습니다

<?php 
$command = 'cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg'; 
system($command); 
$command = 'mkdir /var/www/test_dir'; 
system($command); 
file_put_contents('var/www/test_user.log', posix_getpwuid(posix_geteuid())['name']); 
if (file_exists('/var/www/test.pdf')) { 
    file_put_contents('/var/www/test.log', 'success'); 
} else { 
    file_put_contents('/var/www/test.log', 'fail'); 
} 

cairosvg는 PDF 파일로 SVG 파일을 켤 수있는 CLI 라이브러리입니다. 위의 단계를 거치면이 PHP 코드가 실행되지만 파일은 만들어지지 않습니다. URL을 통해 PHP 파일을 호출하면 파일이 만들어집니다.

내가보기에 유일한 차이점은 프로세스 사용자가 이 www-data이고 URL이 root 인 경우 쉘로 실행 한 경우입니다.

명령 cairosvg -f pdf -o /var/www/test.pdf /var/www/test.svg은 터미널에서 직접 루트로 실행할 때 작동합니다.

두 번째 명령 인 mkdir /var/www/test_dirsystem()이 CLI 또는 매우 간단하게 사용할 수 있는지 확인하기위한 현실적인 검사입니다. 이 명령은 쉘과 URL 모두에서 작동합니다.

이것은 좀 더 복잡한 시스템의 문제에 대한 최소의 완전하고 입증 가능한 예이므로 "셸 단계 건너 뛰기"또는 비슷한 대답이 나에게 도움이되지 않습니다.

저는 PHP 5.6, Ubuntu 14.04 및 Apache를 실행하고 있습니다.

URL로 호출 할 때가 아니라 쉘 호출시이 PHP 코드가 실패하는 이유는 무엇입니까?

+0

downvote에 대한 이유? – Goose

+1

'system'의 반환 값을 살펴 보겠습니다. 명령 출력을 포함해야합니다. 사용자가 대상 파일을 쓸 수 있습니까? –

+0

@NicoHaase 조언을 주셔서 감사합니다. 나는'exec'의 결과물을 버렸지 만 아무 것도주지 않았지만'system' 리턴 상태는'127'을줍니다. 인터넷 검색. 사용자는 루트이므로 예 쓰기 권한이 있어야합니다. – Goose

답변

0

신용은 Nico Haase, pomaxa 및 kvantour에게 의견으로 전달됩니다.

system() 반환 상태는 127입니다. 이는 사용자 (루트)가 cairosvg 명령을 인식하지 못했음을 나타냅니다. 나는 /usr/bin/cairosvg/usr/local/bin/cairosvg으로 심볼릭 링크했고, 모든 것이 작동했다.

셸 내부의 루트가 cairosvg 로컬에 액세스 할 수없는 이유는 아래 explained here입니다. CRON은 제한된 환경에서 명령을 실행합니다..

사용 가능한 환경 변수는 매우 제한 될 수 있습니다. 일반적으로 $ LOGNAME, $ HOME 및 $ PATH와 같이 몇 가지 변수 만 정의됩니다.