다중 프로세스 호스트 프로세스?

다중 프로세스 호스트 프로세스?

저는 현재 다양한 방식으로 서로 의존하는 4개의 프로세스로 구성된 애플리케이션을 유지 관리하고 있습니다. 현재 프로세스는 다음과 같은 진주를 포함하는 상당히 "정교한" bash 스크립트를 통해 시작, 중지 및 모니터링됩니다.

# And another rather dirty way to identify the node Api
# process by knowing the filename that is given to node.js.
# Keep in mind not to kill the retrieved process directly, but
# check the running user and the used port to make sure you
# actually got the correct process.
findApiProcessId() {
    local pid=`ps ax | grep node | grep api/server\.js | cut -c -5`

    if [ $pid ]
    then
        echo $pid
     else
        echo -1
    fi
}

유사한 방법을 사용하여 다른 프로세스를 확인하십시오.

이제 이 프로세스 관리를 완전히 다시 설계할 수 있지만 솔직히 어디서부터 시작해야 할지 모르겠습니다. 내가 모니터링해야 할 프로세스는 다음과 같습니다.

  • lighttpd는 "안정적인" PID 파일을 관리합니다.
  • mongod는 신뢰할 수 없어 보이는 pid 파일을 관리합니다. 때로는 완전히 다른 프로세스에 속하는 pid를 가리키는 경우도 있습니다.
  • 일부 pid 파일을 유지하려고 시도하지만 비참하게 실패하는 node.js 인스턴스(nohup을 사용하여 실행)가 두 개 이상 있습니다.

명령줄에서 개별 프로세스를 시작 및 중지하고 상태를 쿼리할 수 있어야 합니다. 애플리케이션의 다양한 "그룹"에 대해 다양한 디렉토리에서 프로그램을 여러 번 실행할 수 있어야 합니다. 하위 프로세스는 현재 현재 작업 디렉터리의 구성 파일을 확인하고 실행 중인 다른 인스턴스를 차단하지 않고 해당 포트를 "선택"할 수 있습니다.

내 첫 번째 생각은 Python이나 C로 간단한 프로세스 호스트를 작성하는 것이었지만 이는 다소 과잉이라고 생각합니다. 그래서 기존 도구를 찾고 있었는데 "Linux 프로세스 호스트 도구“유익한 것을 공개하지 마십시오.

그렇다면 여러 하위 프로세스를 모니터링할 수 있는 "표준" 프로세스 호스트 도구가 있습니까?

답변1

어때요?runit,"서비스 감독을 통한 UNIX 초기화 방식"?

귀하의 요구 사항을 충족한다고 생각합니다.

나는 대답할 수 없다"몇 가지 변형된 서비스"영리한 방법으로 문제를 해결하려면 물론 서비스를 개별적으로 정의할 수 있습니다. (일부 깔끔한 심볼릭 링크가 있을 수 있고 비밀번호 솔루션을 확인할 수도 있지만 여기서 영리하게 노력하는 것이 좋은 생각인지는 잘 모르겠습니다. 유지보수성)

편집하다 이 ArchWiki 페이지제공빠른 개요아마도 runit이 페이지보다 시작하기 더 좋은 곳일 것입니다.

답변2

pidofpgrep이를 스크립트로 작성하고 의심스러운 관용어를 피하고 싶다면 도움이 될 것입니다 ps | lots | of | things. uid, gid, ppid, 가장 오래된, 최신 등으로 필터링할 수도 있습니다.

이 명령은 kill -0 $pid특정 프로세스 ID가 존재하는지 확인하는 데 사용할 수 있습니다.

서로 다른 디렉터리에 여러 인스턴스가 있고 이들 간의 차이점을 알 수 없는 경우 문제가 발생할 수 있습니다 ps. 플랫폼에 따라 linux check 와 같은 cwd를 통해 쉽게 구별할 수 있습니다 /proc/$PID/cwd.

# pgrep httpd
9483
9492
9493
9497
# head -1 /usr/local/apache2/logs/httpd.pid
9483
# kill -0 `head -1 /usr/local/apache2/logs/httpd.pid` && echo $?
0
# ls -l /proc/9483/cwd /proc/9483/exe
lrwxrwxrwx 1 root root 0 2013-01-30 19:40 /proc/9483/cwd -> /
lrwxrwxrwx 1 root root 0 2013-01-30 19:37 /proc/9483/exe -> /usr/local/apache2/bin/httpd

(죄송합니다. Apache의 $CWD는 그다지 흥미롭지 않습니다...)

당신은 netstat또한 다음을 도울 수 있습니다:

# netstat -plnt | grep :80
tcp        0      0 192.168.123.123:80       0.0.0.0:*               LISTEN     9483/httpd

PID 파일 관리에 능숙하지 않은 프로세스를 모니터링하기 위한 시작 스크립트의 일반적인 트릭은 비데몬/비포크 모드에서 백그라운드 작업으로 파일을 시작하는 것입니다 &(분명히 프로그램에는 비데몬 플래그(때때로 inetd모드라고도 함)가 있어야 하지만) , 그리고 $!PID 파일에 직접 쓰십시오.

pstree프로세스 계층을 추적하는 데 유용한 도구입니다.

#  pstree -lnp 9483
httpd(9483)-+-rotatelogs(9484)
            |-rotatelogs(9485)
            |-rotatelogs(9486)
            |-rotatelogs(9491)
            |-httpd(9492)
            |-httpd(9493)-+-{httpd}(9495)
            |             |-{httpd}(9496)
            |             |-{httpd}(9498)
            |             |-{httpd}(9499)
            |             |-{httpd}(9502)
            |             |-{httpd}(9504)
        [... lots more threads snipped ...] 

최후의 수단으로 lsof다중 플랫폼 도구를 사용하여 파일, 연결 또는 PID별로 상황을 추적하십시오.

표준 프로세스 관리자 유형 시스템의 경우 DJB를 확인하세요.데몬 도구팩. 그의 웹사이트는http://cr.yp.to/daemontools.html, 문서가 솔직히 약간 느릴 수 있지만 튜토리얼과 유사한 페이지가 많이 있습니다.

다음은 사용하지 않은 몇 가지 대안입니다.https://serverfault.com/questions/192302/alternative-to-daemontools-djbtools-to-supervise-unix-processes

관련 정보