프로세스 감시 프로그램

peccavi의 이미지

안녕하세요.

프로세스를 감시해 재시작 시켜주는 프로그램을 작성중입니다.

검색해보니 여러 글타래에서 모니터링 프로그램에 대한 얘기가 나왔었는데요,

궁굼한게 해결되지 않아 질문 드립니다.

이미 구동중인 프로세스의 pid를 이용해 감시 목록에 추가하고 모니터링 하는 부분은 구현이 되었구요,

해당 프로세스가 죽었을 때(이 프로세스를 실행시키는 커맨드는 이미 알고 있다고 가정하고)

커맨드를 fork/exec를 이용해 재기동 시키는것 까지는 구현을 했습니다.

하지만, 죽은 프로세스를 다시 살려서, 또다시 그 프로세스의 pid를 감시 목록에 추가시킬때가 문제입니다.

해당 프로세스가 데몬 형식이 아닌, 내부적으로 fork가 일어나지 않는 일반적인 프로세스라면 상관이 없는데, 만약 이 프로세스가 실제 프로세스를 데몬으로 만들어주기 위한 임시 프로세스일때(자신은 종료하고 자식을 데몬으로 만드는 전형적인 데몬 생성 과정), 실제로 감시해야할 프로세스(자식)의 pid를 감시 프로그램이 어떻게 알수 있나요?

아니면 이런 경우에, 일반적으로 어떻게들 구현하시는지요?

도저히 해결을 못하겠어서 질문 올려놓고 퇴근해야겠습니다.
답변좀 부탁드릴께요~~ :oops:

p.s 1) inittab에 respawn으로 등록되는 프로그램들도 비슷한 상황인것 같아서 여기저기 검색을 해봤는데, 등록시킬 프로그램 내부적으로 fork가 일어나든 안일어나든 상관은 없는것 같습니다.

p.s 2) 감시의 대상이 되는 프로세스들은 위에서 언급한 데몬 실행 형태가 될지, 데몬이 아닌 일반 프로그램이 될지 알 수 없습니다. 또한 이 프로그램들의 코드는 수정하지 못합니다.(pid를 파일로 저장하는 등..)

익명 사용자의 이미지

특정위치 특정이름을 가지는 파일에다가 데몬화이후 PID를 써놓으세요.

peccavi의 이미지

peccavi wrote:
p.s 1) inittab에 respawn으로 등록되는 프로그램들도 비슷한 상황인것 같아서 여기저기 검색을 해봤는데, 등록시킬 프로그램 내부적으로 fork가 일어나든 안일어나든 상관은 없는것 같습니다.

특정 디렉토리에 로그를 주기적으로 남기는 데모 프로그램으로 테스트를 해봤는데

자체적으로 데몬화 되는 실행파일을 등록할 경우엔 정상적으로 respawn이 안되네요..

처음 init가 실행될때도 프로세스가 꼭 10개씩 뜨고요..

그냥 자체적으로 데몬화 되는 프로그램은 등록하지 않는 방향으로 해야겠습니다.

그리고 손님님 답변 감사드립니당..

----
jai guru deva om...

익명 사용자의 이미지

생성된 프로세스들에 대한 정보는 PROC에 있으니 이를 참고하세요..

kdoll의 이미지

모니터에서 fork 후 exec ps하고 결과를 파이프로 받은다음에.

자신이 실행하고 있어야할 프로세스명을 가지고 검사해서

없으면 다시 띄우는 형태가 적절할듯 싶네요.

단점은
- 몇초 간격을 loop를 돌아야 한다는 점이죠. _ _;
- ps를 처리하는 프로세스를 그때마다 만든다는점
- 죽은후 바로 다시 띄우는 것이 아니라 몇초 간격 loop이후 뜬다는것

장점은
- 프로세스 모니터를 내렸다가 새로 올릴 수 있다.
- 운영체계에 영향을 받지 않는다. (PS 결과 포멧팅만 잘하면됨 <= 요 부분을 파일로 작성한다. OS바꾸면 요 명령어만 바꾼다)

전 장점이 더 커보여서 그렇게 했습니다.

익명 사용자의 이미지

* 우려
실행파일명으로 하는 것은 실행파일명이 유일하지 않을 수 있으므로 fullpath를 검토해야 합니다.

ktd2004의 이미지

http://cr.yp.to/daemontools.html

daemontools 이라는 패키지가 있습니다. 같은 역할을 하는 프로그램인것 같습니다.
참고하시면 좋을 것 같습니다.

ssehoony의 이미지

제가 만든 것은 이런 구조 입니다.
도움이 됐으면 해서 올립니다.

공유메모리에
데몬 pid, 실행 fullpath & 실행 argument, 모니터링 최근 시간
위 내용가 더 추가로 기록하고 싶은 데이터를 여러개 등록할 수 있는 공간을 만듭니다.
그리고 세마포어를 이용해 뮤텍스를 구현해서 모니터링을 받고 싶은 데몬은 스스로가 공유메모리에 자기의 정보를 기록합니다. 그리고 정상적으로 종료가 됐을 때는 (보통 sigterm 을 받았을 때) 공유메모리에서 자기 정보를 삭제하고 자신을 종료합니다.
이렇게 하면 공유메모리를 일정 간격 모니터링하는 녀석이 공유메모리에 기록된 pid 가 실제 /proc 에 존재하는지를 확인해서 없다면 곰뮤메모리에 기록된 실행 fullpath & 실행 argument 로 실행을 하나 하고 기존의 죽은 놈에 대한 공유메모리 기록은 삭제를 합니다.
이렇게 하면 데몬을 임으로 stop 도 가능하고 추후 데몬을 계속 추가 해도 모니터링 툴은 별도의 수정 작업이 필요 없는 장점이 생지기요.

참고로 전 공유메모리에 최근 모니터링 시간과 몇번 되살렸는지 정보도 같이 남기고 그 공유메모리를 콘솔에서 볼 수 있는 툴도 만들었습니다.
되살아 났는지의 여부를 통해 데몬에 버그가 있음을 인지 하기 위함이었지요.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.