2012-08-03 2 views
2

.sh 스크립트가 SSH 쉘을 통해 정상적으로 작동하지만 PHP 또는 crontab을 통해 실행될 수없는 원인은 무엇입니까?쉘 스크립트가 ssh를 통해 사용될 때만 응용 프로그램을 시작합니다.

게임 서버를 실행하는 VPS가 있지만 유지 관리가 가능하도록하기 위해 지루한 프로세스 (서버 설정 또는 삭제)를 시작하고 중요한 기능 (예 : 시작 및 종료)을 자동화 할 계획입니다. 실제로 서버를 필요로하는 사람들이 쉽게 수용 할 수 있습니다.

이제 쉘 스크립트를 만들었고 테스트했을 때, 그들은 절대적으로 잘 작동했습니다. startserver가 서버를 시작하고 restartserver가 서버를 다시 시작했지만 PHP에서 실행하거나 나중에 - crontab을 알아 냈을 때 서버를 마술로 시작하면 작동하지 않습니다. 그것들을 멈추게하고, 그들이 실행 중인지 확인하고, 업데이트하고, 의도 한대로 작동하는 다른 모든 기능들을 수행하지만, 서버를 시작하는 것은 아무 것도하지 않았습니다. 아무 것도 인쇄하지 않고 방금 0을 반환했습니다. (statusserver.sh) 어떤 경우에 작동하지 않는 한 여기

/sbin/start-stop-daemon -v -t --start --exec ~mta/servers/$1/files/mta-server -- -d 

그리고 : (startserver.sh)

예를 들어

, 여기에 두 경우 모두에서 작동하는 스크립트의 예입니다

/sbin/start-stop-daemon -v --start --exec ~mta/servers/$1/files/mta-server -- -d 

유일한 차이점 은 statusserver.sh 실제로 성공할 수 -t없이 동일한 명령을하는 경우에만 당신을 말할 것이다, "-t"가지고 있다는 것입니다. 그리고 실행 statusserver.sh과 같이 :

sudo -u mta ~mta/sh/statusserver.sh test 

실제로 수행 작업, "~ MTA/서버/테스트/파일/MTA 서버 -d를 시작할 것"의 라인을 따라 인쇄 뭔가. 하지만 이렇게하면 :

sudo -u mta ~mta/sh/startserver.sh $2 

절대적으로 아무것도하지 마십시오. 아무 것도 출력하지 않고 실제로 0을 반환합니다. (작업이 성공했다는 것을 의미합니다)

이제 재미있는 부분을 위해 : 서버가 이미 실행 중일 때 startserver.sh는 do : 서버가 이미 실행 중이며 오류 코드를 반환한다고합시다. (왜냐하면 start-stop-daemon은 나를 위해 그것을 수행하기에 충분히 친절하기 때문입니다.) 그러나 그것은 평범한 것이고 무엇이든 시작하는 것을 거부합니다.

교체 시작 - 중지 - 데몬에게 같은과 :

sudo -u mta ~mta/servers/test/files/mta-server -d 

정확히 같은 일을 수행합니다, 그것은 여전히 ​​그렇고 0

아를 반환하면서 그냥 실행을 거부합니다 아니다 sudo 문제. 다음은 잘 작동하기 때문에 그 중 나는 확신합니다 너무

sudo -u web1 sudo -u mta ~mta/scripts/startserver.sh test 
그래서 다시 내 질문에

: 리눅스, 셸, 강타 또는를 실행할 때 밖으로 응용 프로그램을 시작하기를 거부 평면에 무엇을 일으킬 수있는 것 PHP 나 crontab 중 하나일까요? SSH를 통해 실행되면 행복하게 받아 들일 수 있습니까? 전환해야 할 설정이 있습니까? 내가하고 싶은 것을 막을 수있는 패키지? 내가 놓친 다른 어떤 것?

+0

실행 파일로 스크립트 또는 바이너리를 지정 했습니까? –

+0

예. 다른 사용자의 홈 폴더에서 쉘 스크립트를 실행하여 다양한 작업을 수행하고 있으며, SSH를 사용하여 트리거 할 때 모두 작동합니다. 그러나 PHP를 사용하면 시작 명령이 실행되지 않습니다. – Gamesnert

답변

0

찾아보기 sudo.

아파치가 (일반적으로 'nobody'사용자 또는 'apache'사용자 용으로) 실행하는 사용자에 대해 (예 : visudo를 사용하여) Apache를 보통 실행하는 것으로 설정하십시오.NOPASSWD 옵션을 사용하여 실행하려는 명령에 대한 sudo 액세스 권한을 부여하십시오.

PHP 스크립트에서 exec()를 사용하여 데몬을 시작/중지하고 명령에 sudo 명령을 접두어로 사용하십시오. 여기

은 sudo는 대한 기사입니다 :

http://www.cyberciti.biz/tips/allow-a-normal-user-to-run-commands-as-root.html

+0

PHP 파일 (web1)의 사용자는 이미 sudo를 사용하여 다른 사용자 (mta)에 명령을 실행합니다. (예 : "sudo -u mta sh /home/mta/sh/startserver.sh $ 1") 모든 명령이 작동하므로 제대로 작동합니다. startserver.sh와 별개로, 웹 서버 나 내가 알아낼 수없는 뭔가에 의해 제한이있는 것으로 보입니다. 이 질문을 조금 더 명확하게하기 위해 질문을 수정하겠습니다. – Gamesnert

0

내가 저스틴에 접촉 된 생각으로,하지만 특별히 언급하지 않았다, 그것은 스크립트이다를 실행 할 수없는 문제를 보일 수있을 것입니다 아파치 사용자 계정 (일반적으로 꽤 제한적이다)은 권한 때문에 사용자의 홈 디렉토리를 볼 수 없다. 일반적으로 사용자와 루트 만 자신의 홈 디렉토리를 볼 수 있습니다. 몇 가지 작업을 수행 할 수 있습니다. 홈 디렉토리에서 스크립트를 실행하려면 sudo를하고, 사용자의 홈 디렉토리에서 스크립트를 이동하거나, 스크립트/홈에 대한 권한을 변경하여 아파치가 사용자의 홈 디렉토리에서 실행할 수 있도록 할 수 있습니다.

+0

지금은 질문 자체와 저스틴의 대답에 대해 좀 더 자세하게 설명하려고 했으므로 그렇지 않을 수도 있습니다. 이 경우에, 나는 서버 등을 멈추지 않을 것이고 또한 문제를 제기 할까? 현재로서는 그렇지 않습니다. "start-stop-daemon -v --start"는 이유에 대한 어떠한 표시도없고 실행 코드를 0으로 반환하는 것을 거부합니다. 일반적으로 성공을 나타냅니다. 나는 거기에서 틀릴 수 있었다. 어느 쪽이든, 나는 상황에 대해 약간 불분명하지만, 어쨌든 그것을 정리하려고 노력해 주셔서 감사합니다. – Gamesnert

관련 문제