2009-06-12 9 views
4

웹 서버의 백그라운드에서 실행중인 응용 프로그램이 필요하지만 루트 권한으로 응용 프로그램을 시작/중지 할 수 있어야합니다.웹 서버를 통해 명령을 받아들이는 Linux 서비스를 만드는 방법은 무엇입니까?

이렇게하려면 루트 권한이있는 서비스를 실행하여 응용 프로그램을 종료하고 필요할 경우 다시 시작할 수 있도록하고 싶습니다.

마지막으로 웹을 통해 간접적으로 제어 할 수 있도록 Apache/PHP를 통해 서비스에 start 및 kill 명령을 보낼 수 있어야합니다.

어떻게 Linux 서비스를 만들 수 있습니까?
이 방법으로 Linux 서비스와 통신하려면 어떻게합니까?

미리 감사드립니다.

답변

6

PHP 스크립트에서 exec 명령을 사용하여 쉘 파일을 호출하십시오. 쉘 파일은 "setuser"비트로 설정할 수 있으므로 웹 서버의 권한으로 실행하는 대신 소유자로 실행됩니다. 물론

, 당신은 매우 조심해야합니다 - 등 테스트, 모니터링, 많이

마지막으로, 서비스가 없습니다 루트로, 전용 사용자로 실행에 대해 생각합니다. 예를 들어 아파치와 다른 잘 된 서비스가 있습니다.

추가 : Re : Linux에서 서비스를 실행 중입니다. 리눅스에 대한 귀하의 취향에 달려 있습니다. 앱 서비스가 자동으로 실패하면 다시 시작하여, 플러스 로깅됩니다, 체크 아웃 Runit 확인하려면 다음

https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

추가는 대신이 setuid 비트, 나는 프랭크의 생각 sudo 시스템을 사용하는 것에 대한 의견 (논평에서)이 더 낫다.

+4

오히려 SETUSER 비트보다 당신을/etc /의 sudoers 예에 스크립트의 실행을 허용하는 규칙을 추가 할 수 있습니다 원하는 서비스를 만들 수 있습니다 아파치를 ALL = (root) NOPASSWD : /bin/my.restart.script.sh - 그러면 그냥 exec ('sudo /bin/my.restart.script.sh'); –

+0

+1 프랭크에 동의합니다. 난 당신의 특정 cmds에 대한 sudoers를 설정하는 것이 setuser 비트를 설정하는 것보다 낫다고 생각합니다.또한 sudo는 일반 사용자 (php server)가 sudo 명령을 호출 한 시간을 root로 기록 할 수 있습니다. –

+0

회신 해 주셔서 감사합니다! 내가 그 서비스와 어떻게 통신 할 수 있는지 알고 있니? –

0

매우 신중해야합니다. exec 명령으로 웹에서 사용자가 제출 한 데이터를 절대로 사용하지 마십시오. 누군가가 임의로 컴퓨터에서 명령을 실행할 수 있습니다.

또한 Frank는 sudo 규칙을 사용하므로 필요없는 권한으로 특정 명령을 실행할 수 있습니다. 그렇게하면 더 안전하게 될 것입니다.

+0

네, 그게 바로 제가 "간접적으로"말한 이유입니다. 난 그냥 명령을 시작하고 죽일 필요가 없으므로 나는 어떤 텍스트 명령이나 복잡한 것에도 지나치지 않을 것이다. 인증은 PHP 프론트 엔드에 의해 처리됩니다. –

1

다음 명령을 받아들이는 데몬을 만들 수 있습니다 : 데몬을 시작

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

어렵지 않을 것이다. PHP 스크립트에서 daemon_name start을 실행하면됩니다. 시작한 후에 프로세스의 PID를 잠금 파일에 기록하여 나중에 중지, 다시 시작 또는 다시로드 할 수 있습니다. 데몬은 신호를 처리해야합니다.

PHP 스크립트에서 daemon_name stop을 호출 할 수 있습니다. 이것은 잠금 파일을 검사하고 실행중인 데몬의 PID를 얻고 실행중인 데몬이 처리 할 신호를 보내는 새로운 데몬을 시작해야합니다.잠금 파일을 제거하거나 지우고 데몬/프로세스를 시작하는 stop을 종료 할 수 있습니다.

+0

간단히 말해서, 나는 훨씬 더 복잡해 질 것이라고 생각했습니다! –

1

나는 모든 종류의 서비스를 실행하도록 구성 할 수있는 inetd을 봐야한다고 생각하며 루트로 실행됩니다. 그런 다음 자신이 루트 권한이 아닌 상대적으로 간단한 프로그램을 작성할 수 있지만 루트로 실행할 때 필요한 작업을 수행 할 수 있습니다.

1

서비스와 통신하는 경우 서비스의 유형을 말하지 않았지만 직접 작성한다고 가정 할 때 가장 일반적인 방법은 UNIX 소켓 또는 MMAP를 통해 통신하는 것입니다. 당신의 필요에 따라 달라집니다.

오, 그래, 이미 리눅스 시스템의 웹 관리를위한 응용 프로그램이 있다는 것을 지적해야합니다. Webmin은 필요한만큼 제어 할 수 있도록 구성 할 수있는 정말 좋은 도구입니다. 루트 권한

  • 응용 프로그램
  • 귀하의 문제가 시작되지 않은 응용 프로그램을 모니터링

  • 데몬없이

    • 웹 서버 :

  • 3

    그래서, 당신은 여기에 세 가지가 데몬은 루트 권한이 필요없이 웹 서버에서 쓰고 통신하고 있습니다. 나는 PHP를 developper 아니지만, 메시지 큐와 PHP를 찾고, 내가
    beanstalkd가 보면 발견

    # my_dameon & 
    

    :

    데몬은 백그라운드에서 실행이 아닌 대화 형 응용 프로그램으로 간단하게 할 수있다

    • 그 파일은 아파치/PHP는
    • 을 beanstalkd 몇 가지 메시지를 보냅니다 : 첫 번째 페이지에있는 예제는 당신이 다음을 수행하는 데 사용할 수 있습니다 보인다 데몬이 beanstalkd에서 메시지를 읽습니다. 명령에 따라 백그라운드 응용 프로그램을 시작하거나 종료하거나 다시로드합니다.

    client in many languages
    이 있기 때문에 당신은에서 웹 프런트 엔드를 분리하는 좋은 방법이 될 것입니다 Beanstalkd를 사용하여, @shodanex에서 알 수 있듯이 또한 this question

    1

    를 확인할 수 PHP에서 데몬을 쓸 수 있습니다 루트에서 실행중인 명령 행 작업자. 그것은 필요한 것만을 정확히 실행하도록 간단히 설정할 수 있습니다.

    작업자를 실행하려면 Pear's System_Daemon이 start/stop/restart를 사용하여 데몬 실행 스크립트를 생성하고 실행할 수 있습니다.

    sudo apt-get install openbsd-inetd 
    

    와 물론