데폰 프로그램을 시작하고 종료하기

hivaless의 이미지

데몬 프로그램을 시작하고 종료할 수 있도록 만들려고 합니다.

예를 든다면 httpd 와 같은 방식으로 동작되게 만들고 싶습니다.

httpd start 명령으로 프로그램을 구동시키고, httpd stop 명령으로 프로그램을 종료하도록 하는 것과 같이 만들고자 합니다.

그렇게 하기 위해서 start 명령에는 fork 명령을 사용해
데몬으로 실행해 주면 되지만,
정상적으로 데몬 프로그램을 종료시키기 위해 httpd stop 과 같은 명령을 어떤식으로 구현해야 되는지 알고 싶습니다.

httpd stop 이 실행되 이전에 실행되고 있던 httpd 프로세스에게 종료하라는 신호를 전달해줘서, 실행되고 있던 httpd 프로세스에서 내부적으로 정상적으로 종료되도록 처리를 하면 좋겠지만,
어떤식으로 해야 될지 잘 모르겠습니다.
kill 함수를 사용해서 시그널을 전달하는 방법을 생각해 봤지만,
kill 함수는 pid 값을 넘겨줘야 하는데, 신호를 전달받는 프로세스의 pid 값을 어떻게 아는지 모르겠습니다.

질문이 한가지 더있습니다.
데몬 프로그램을 실행되고 있는 경우, 컴퓨터를 종료했을때, 실행되고 있던 데몬 프로그램이 신호를 받아서, 파일을 닫거나, 메모리에 저장된 내용을 파일에 쓴 후, 종료될 필요가 있습니다. 이 경우 어떤 신호를 받아서 처리를 해야 하는지 알고 싶습니다.

답변 부탁드립니다~ 꾸벅~~

서지훈의 이미지

1. daemon이 처음 구동시 자신의 pid를 파일에 저장해 두시면됩니다.
/var/run을 보시면 현재 구동중인 daemon 에 대한 pid를 아실 수가 있습니다.

2. SIGTERM을 받아서 처리해주시면 될듯합니다.
signal 처리부분을 참고 하세요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

익명 사용자의 이미지

ㅁㅁㅁ

익명 사용자의 이미지

서지훈님 말씀대로 처리 하면 될 것 같습니다.
답변 감사드립니다.

확실히 컴퓨터가 종료될때 SIGTERM 신호를 받는 것을 확인했습니다.

그런데 의문나는 점이 있어 이렇게 글을 올립니다.

제 프로그램 같은 경우에는 데몬으로 돌면서, 중간중간마다 작업할 일이
생깁니다. 하지만 이렇게 일을 처리하는 도중에 컴퓨터가 종료되버릴때에는,
파일을 정상적으로 닫지 못하고, 또 메모리에 있는 내용을 파일에 쓰지 못하였기 때문에, 데이터가 깨져 다음 부팅시 프로그맹이 정상적으로 수행되지 않습니다. 그렇기 때문에 컴퓨터가 종료되기 전에 반드시 정상적으로 종료 처리를 해주어야 하는데, 그렇다면 SIGTERM 신호를 받아서 파일을 닫거나 하는 작업을 하면 됩니다. 하지만, 현재 하는 작업이 시간이 많이 걸릴수도 있습니다. 구현상 꼭 이 작업은 마치고 프로그램을 종료해야 합니다. 하지만, 작업 시간이 오래 걸릴경우, 제 프로세스가 강제로 종료되는 현상이 발생할 것 같은데,
이 문제는 어떻게 해결 해야 할까요?

제 프로그램이 정상적으로 일을 마치고 종료할때까지 컴퓨터의 종료를 지연시킬 수 있는 방법이 있을까요??

서지훈의 이미지

컴퓨터가 종료를 한다라는건 정상적인 종료(shutdown)이 아니라 비정상적인 종료를 말씀 하시는 건가요?
여기에 대해서는 소프트웨어 적으로는 뚜렷한 해결책이 없습니다.
다른 HA(High Availablity)장비를 이용해서 시스템을 안정화 시키는 방법밖에는...

아니면 파일시스템에서도 이러한 경우를 대비해서 journalling 시스템을 이용하듯 이런 방식을 이용하시는 것을 권유해 드릴 수 있으나, 이건 구현과 데몬의 성격에 따라서 성능이 떨어지는 문제가 발생 할 수도 있으니 잘 확인 해보시고 사용하실것을 말씀드리고 싶군요.

그리고 가장 좋은 방법은 시스템의 비정상 종료에 의한 경우는 data를 초기화해서 다시 구동하도록 하는게 나을듯 보입니다.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

mrjh76의 이미지

히바리스 wrote:
서지훈님 말씀대로 처리 하면 될 것 같습니다.
답변 감사드립니다.

확실히 컴퓨터가 종료될때 SIGTERM 신호를 받는 것을 확인했습니다.

그런데 의문나는 점이 있어 이렇게 글을 올립니다.

제 프로그램 같은 경우에는 데몬으로 돌면서, 중간중간마다 작업할 일이
생깁니다. 하지만 이렇게 일을 처리하는 도중에 컴퓨터가 종료되버릴때에는,
파일을 정상적으로 닫지 못하고, 또 메모리에 있는 내용을 파일에 쓰지 못하였기 때문에, 데이터가 깨져 다음 부팅시 프로그맹이 정상적으로 수행되지 않습니다. 그렇기 때문에 컴퓨터가 종료되기 전에 반드시 정상적으로 종료 처리를 해주어야 하는데, 그렇다면 SIGTERM 신호를 받아서 파일을 닫거나 하는 작업을 하면 됩니다. 하지만, 현재 하는 작업이 시간이 많이 걸릴수도 있습니다. 구현상 꼭 이 작업은 마치고 프로그램을 종료해야 합니다. 하지만, 작업 시간이 오래 걸릴경우, 제 프로세스가 강제로 종료되는 현상이 발생할 것 같은데,
이 문제는 어떻게 해결 해야 할까요?

제 프로그램이 정상적으로 일을 마치고 종료할때까지 컴퓨터의 종료를 지연시킬 수 있는 방법이 있을까요??

도움이 되는지 모르겠지만...

레드헷 계열의 리눅스는 /etc/rc.d/init.d 디렉토리에 데몬들을 컨트롤하는 스크립트가 모여있습니다!
간단히... init 스크립트를 작성하면 되지 않을까 싶습니다!

그리고... 해당 런레벨에서... 종료시 수행할 스크립트에 등록해 주면 쉽게 될것 같은데요!!!

종료 시그널 보내고... 데몬이 완전히 종료될때까지... 기다려면 될것 같아요!!!

댓글 달기

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