저는 현재 다양한 방식으로 서로 의존하는 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 초기화 방식"?
귀하의 요구 사항을 충족한다고 생각합니다.
- "runit의 서비스 감독은 감독자 프로세스에 의해 자동으로 실행되도록 설계된 서비스 데몬에 대한 종속성을 해결합니다."더)
- 실행 중인 서비스 확인은 다음을 통해 수행할 수 있습니다.
sv status service
- 이미 많은 것들이 있습니다서비스 정의, 사용하기 쉬우며 자신만의 것을 구축하기 위한 훌륭한 리소스입니다.
- 다양한 배포판용으로 패키징되어 있으며 매우 성숙합니다(
lighttpd
위키 페이지 가 있습니다runit
, 당신은 또한 볼 수 있습니다이러한 실행 스크립트에는 다음이 포함됩니다lighttpd
.mongodb
) - 다양한 데몬 변형을 수용할 수 있습니다(예:node.js는 전혀 문제를 일으키지 않습니다.)
나는 대답할 수 없다"몇 가지 변형된 서비스"영리한 방법으로 문제를 해결하려면 물론 서비스를 개별적으로 정의할 수 있습니다. (일부 깔끔한 심볼릭 링크가 있을 수 있고 비밀번호 솔루션을 확인할 수도 있지만 여기서 영리하게 노력하는 것이 좋은 생각인지는 잘 모르겠습니다. 유지보수성)
편집하다 이 ArchWiki 페이지제공빠른 개요아마도 runit
이 페이지보다 시작하기 더 좋은 곳일 것입니다.
답변2
pidof
pgrep
이를 스크립트로 작성하고 의심스러운 관용어를 피하고 싶다면 도움이 될 것입니다 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