프로그램을 모리터링하는 프로그램을 짜려로하는데요....

miso의 이미지

제가 짠 서버가 살아 있나 죽어있나 감시하는 프로그램을 짜려고 하는데요...

제가 짜려는 감시프로그램에서.... 제가 실행시킨 서버의 pid를 알 수 있는 방법이 있나요?

아님... 어떤 프로세서가 살아있나 죽있나 알 수 있는 함수가 있나요?

아님... 프로그램의 이름으로 프로세서의 pid를 알수 있는 방법은 없을까요?

제가 알고 싶은 것은 프로세스가 살아있는지 죽었는지 알수 있는 함수나...
구현 방법을 알고 계시면.....
조언 부탁드립니다.... ^^;;;

정장혁의 이미지

저의 경우는 서버프로그램에서 자신의 pid를 홈디렉토리에 파일로 쓰도록 하는 방법을 사용하였습니다.
그런데, 만약 서버프로그램이고 통신포트를 사용한다면 , 그포트로 접속하는 방법을 통해 확인도 가능할 것입니다.

charsyam의 이미지

뭐, 여러가지 방법이 있겠죠.

위에분 말씀대로 서버가 생성되면서, 자신의 pid를 기록한다든지, 소켓을

열어둔다든지, 아니면 ps같은 것을 써서 실행파일명으로 pid를 얻어내는

것도 가능하구, 여러가지가 있겠네요.

간단하게는 소켓을 열어두고 접속이 되면 살아있는걸로 판단하는게

제일 쉬울것 같기도 하네요. 그럼 고운 하루

=========================
CharSyam ^^ --- 고운 하루
=========================

miso의 이미지

charsyam님 말씀 처럼... 서버 프로그램을 실행 시킬때 pid를 찍게 해서....
서버 프로그램의 pid를 안 상태에서.....
어떻게 pid로 프로세스가 살아있는지 죽어 있는지 알수가 있나요?

*^^*

charsyam의 이미지

ps 를 해보면 프로그램의 pid를 알 수 있습니다.

단 이경우에는 프로그램이 다운되서 동작을 안하는 형태라면 별로

효과가 없겠죠. ^^

=========================
CharSyam ^^ --- 고운 하루
=========================

snoman의 이미지

proc filesystem은 pseudo filesystem으로, 커널의 data structure에 접근할 수 있는 인터페이스입니다.
만약 pid가 1234라면, 그 프로세스에 대한 정보는 /proc/1234라는 서브 디렉토리 밑에 생성됩니다(OS마다 조금씩 다릅니다). pid는 모르고 프로그램의 이름만 알고 있다면 /proc 밑의 모든 서브디렉토리를 다 검색해서 파일을 읽어보면 찾을 수 있습니다.
제가 얼마 전에 짠 라이브러리 루틴은 한 프로세스가 여러 개의 인스턴스를 갖지 못하도록 하는 것이었습니다. pid file을 생성해서 pid를 알고 있다고 하더라도, 그 프로세스가 죽은 후 다른 프로세스가 그 pid를 재사용하는 경우도 생각할 수 있기 때문에(리부팅된다든지, 최대 pid를 넘어서 다시 처음부터 pid를 부여한다든지 하는), pid를 가지고 proc filesystem을 점검한 후 동일한 프로세스인지를 먼저 확인하도록 했습니다. 그 외에 프로세스의 각종 상태도 알 수 있습니다.
물론 특정 프로세스만이 아니라 전체 시스템의 상태 정보도 확인할 수 있습니다.

아직 멀쩡히 살아있는데 死因은 무슨....

stoneshim의 이미지

Quote:
제가 짜려는 감시프로그램에서.... 제가 실행시킨 서버의 pid를 알 수 있는 방법이 있나요?

monitor를 daemon과 같은 local machine에 둔다면 대개 daemon자체에서 monitor를 fork/exec 합니다.
그러면 monitor에서 getppid()로 가져가면 되겠죠.

local machine에 monitor를 두는데, daemon에서 fork/exec 하지 않을 이유는 별로 없어 보입니다만, 별도로 실행시키신다면 윗분들의 말씀대로 하시면 됩니다.

local machine이 아닌 곳에 monitor를 두시려면 윗분 말씀대로 socket을 이용하시면 됩니다.

Quote:
어떻게 pid로 프로세스가 살아있는지 죽어 있는지 알수가 있나요?

kill(pid, 0); 하셔서 return값이 -1이고, errno==ESRCH 면 해당 프로세스가 없는겁니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

Dr_stein의 이미지

모니터링 하고 싶은 Daemon의 정보를 Daemon이 직접 shared memory에 올리고, monitor가 shared memory를 읽어보는 방법도있습니다.
pid같은경우 처음에 Daemon이 뜰때 적어놓겠지요...

앞마당 먹고 시작한 저그의 8할은 뮤탈 테크를 먼저 탄다. 하지만 나머지 2할때문에 항상 스켄이 모자란다. - _-;

xjiwoox의 이미지

리눅스의 경우에는 일반적으로 /proc 디렉토리를 뒤지면 프로세스 정보를 알 수가 있습니다.

프로세스가 자신의 pid정보를 화일로 저장하는 방법도 있을 수 있을테구요. 간단하게 쉘 스크립트로 알아낼 수도 있습니다.
ps -ef로 현재 실행되고 있는 프로세스 목록을 얻은 다음, grep 명령어로 해당 프로세스명이 포함된 라인을 얻어내고, grep -v명령으로 grep 명령 자체에 대한 라인을 걸러내고, cut 명령으로 pid에 해당되는 필드를 읽어오면 됩니다.
이렇게 해서 pid가 구해진다면 프로세스가 살아있는거고, 안 구해지면 프로세스가 죽은 상태라고 보시면 되겠죠.

s(˘∼˘*)z,·´″"`°³о$ √(´∀`√)... (˘ヘ˘ㆀ)a

펑키의 이미지

저의 요즘에 한가해져서 같은 종류의 프로그램을 만들고 있습니다. 원래 목적은 단지 감시만 할려고 했는데 한가해지는 시간이 길어 지면서 일종의 프로젝트 성격이 되어 버렸습니다. )

기존에 만들어 놓은 C/S가 있는데 업체 요청으로 서버측의 클러스터링과 관리 도구를 준비중입니다. 먼저 관리만을 놓고 생각 하면 각 개별 머신당 서버를 관리하는 아주 자그마한 서버가 또 존재합니다. 이것은 inittab에 등록 해놓고 절대로 죽지 않게 만들었습니다. 이녀석이 서버를 실행 하는데 서버는 자신이 실행될때 자신의 pid와 구동 시간을 적어 놓고 실행됩니다. 그러면 관리 프로그램이 그녀석의 pid 파일을 보고 찾아 봅니다. 존재하면 프로그램은 정상적으로 작동중인것입니다.

더불은 일정한 시간 간격으로 chit-chat 전문을 쏘아 보냅니다. 이것은 아주 의미없는 17바이트 짜리(원래 C/S 전문이 17바이트 시스템 구조체 헤더를 가지고 있어서) 전문을 쏘고 라운드 되어 오는 시간을 측정 해 봅니다. 그리고 마스터 관리 서버라는 녀석이 또 존재하는데 이녀석에게 그 정보를 그 시간 간격 만큼 보고 합니다.

마스터 서버라는 녀석은 여러 서버에게(등록된) 일정한 전문을 요청해서 그 응답을 받고 마스터 클라이언트 관리 툴이 접속해 들어 오면 관리툴에게 브로드 캐스팅 하는 형식입니다. 즉, 전체적으로 보면 subscribe/publish 방식입니다.

관리툴에서는 원하는 서버를 구동하거나 잠시 죽이거나 하는 기능을 가지고 있고 서버 정보(메모리나 CPU 사용량등등)를 요청하는데 이 역시 subscribe / publish 방식입니다. 일종의 HTS와 비슷한 역할을 하고 있습니다.

처음에는 사용자들의 전문 모두를 잡아서 보낼까 했는데 이게 서버 트레픽의 원인이 될것 같아서 이 부분은 뺴 버렸습니다. 현재 서버의 디스크립터 갯수 정도나 보내는 수준입니다.

대충 이정도입니다. 어떤 경우 보니깐 ping을 하는 경우도 있는데 실제 원하는 에플리케이션의 죽고 살고 하는것은 이것으로 알수는 없을것 같습니다. 이렇게 하고 노니깐 실제 서버의 LOAD를 알수가 있어서 클러스터링의 기초가 되는것 같습니다. 좀더 다듬으면(한참 걸리겠죠) L4보다 훨씬 좋은 L7 정도의 클러스터링이 될수도 있을것 같습니다. 이야기가 샛네요.

lunarainbow의 이미지

miso wrote:
제가 짠 서버가 살아 있나 죽어있나 감시하는 프로그램을 짜려고 하는데요...

제가 짜려는 감시프로그램에서.... 제가 실행시킨 서버의 pid를 알 수 있는 방법이 있나요?

아님... 어떤 프로세서가 살아있나 죽있나 알 수 있는 함수가 있나요?

아님... 프로그램의 이름으로 프로세서의 pid를 알수 있는 방법은 없을까요?

제가 알고 싶은 것은 프로세스가 살아있는지 죽었는지 알수 있는 함수나...
구현 방법을 알고 계시면.....
조언 부탁드립니다.... ^^;;;

이번에 숙제 때문에 간단하게 구현한 것이 있습니다.

사용한것은, snmp프로토콜이며...

net-snmp에서 지원해주는 C API 입니다.

시간은 부족하고, 자료는 없고, 해서 엄청 허접스럽게 일단은 돌아만 갈 정도로 짰는데...;;

혹시 필요하시다면..;;

[19949]            bash     1508 KByte             18
[19983]            sshd     2012 KByte
[19985]            sshd     2236 KByte              6
[19986]            bash     1500 KByte              1
[20020]            sshd     2012 KByte
[20022]            sshd     2228 KByte              3
[20023]            bash     1500 KByte
[22119]           snmpd     5588 KByte           1629

Network Trafic IN  :     0.03 (Mb)
Network Trafic OUT :     0.03 (Mb)

간단하게 이정도 만들어 두었습니다. (숙제 제출용 이기 때문에 ㅋㅋ)
제일 앞의것이 PID, 두번째는 프로세스 이름, 세번쨰는 메모리 사용량, 네번째는 CPU사용량
밑의 두줄은 일정 간격동안 사용한 네트윅 트레픽 양...

대략 2주일만 snmp에 대하여 공부해 보신다면,

API가 워낙에 좋아서, 원하시는대로 작성 하실 수 있을 것입니다.

ps. 쓰고보니 너무 오래전이어서, 지금쯤 해결된것이 아닐까 싶군요 ^^;;

imza의 이미지

C API 에 대한 예제소스를 좀 받아 볼 수 있을까요??

imza2@daum.net 입니다. ㅠㅠ

preisner의 이미지

너무 어렵게들 생각 하시는거 같은데.. ^^
pidof 명령을 쓰세요.
그럼 해당 프로세스의 pid를 가져 올 수 있습니다.
간단하게 쉘 스크립트로 만들면 되겠는데요?

참고로 /proc 을 읽어서 한다
/proc/PID/cmdline 을 read 하면 해당 프로세스 이름을 찾을 수 도
있습니다.

issue00의 이미지

kill 함수.....
두번째 인자를 널로주면 ...반환값에 따라 해당 프로세스의 존재유무를 알수 있습니다.

군데 언제 날리져불 유저되찡...
하도 질문을 해대떠니....ㅡㅡ

항상 깨어있어라 ~~~

winchild의 이미지

좋은 생각들을 많이 내놓으셨는데... 가장 간단하고 확실한 방법은 이겁니다.

일단 pid 를 통하여 감시해야 하므로 pid 얻는 방식은 일반적으로 /var/run/ 에 파일명으로 생성하거나 하여... 프로세서의 PID 는 알아 냅니다.

그리고 감시하고자 하는 프로그램에는 signal (SIGUSR1, SIG_IGN) 으로 시그널 SIGUSR1 에 대한 요청은 무시합니다.

그리고 감시하는 프로그램에는 주기적으로 kill (pid, SIGUSR1) 을 날려봅니다. 이때에 kill 시그널이 정상적으로 전달이 되면 0 이 리턴됩니다. 만약의 해당 프로세서가 종료된경우이면 -1 이 리턴됩니다.

이것으로 해당 프로세서의 동작유무를 확인할 수 있습니다. 다만 해당 프로세서가 defunct 된경우에는 정상적으로 동작하고 있는것으로 리턴됩니다. 따라서 defunct 가 되지 않도록 하는 처리도 신경을 쓰셔야 합니다. defunct 는 해당 프로세가 종료되었을 경우 parent 프로세서가 wait() 로 서 받아주지 않음으로 발생하는 문제이므로 그에 대한 처리는 보완해야 할것 입니다.

예전에 실용프로그램에서도 이용한 것이므로 확실한 방법입니다. 참조가 되시기를...

- 겨울아찌 -

- 겨울아찌 -
winchild@kldp.org

powerson의 이미지


어떻게 보면, 과거 inet.d 혹은 xinet.d와 같은 superdaemon 성격의 프로그램을 작성하시려는거 같은데, 따로따로 실행하는 경우에는 /var/run 등에 pid를 구해야 하겠지만, superdaemon에서 fork + exec 계열 을 조합해서 사용하면, pid로 알 수 있으며, 죽었을 경우에는 parent process에게 SIGCHILD signal을 보내주기 때문에 감시가 좀더 수월하지 않을까 생각됩니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.