python daemon 개발

paori·2021년 2월 23일
0

아주 작은 기록

목록 보기
5/8

daemon : 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램

서버 연결이 종료 되어도 백그라운드에서 계속해서 실행되기 때문에 나는 실시간으로 로그를 파싱하고 db에 저장하는 코드를 daemon으로 개발하였다. ~~나는 퇴근해도, 다른 직원 분들과 해커들은 퇴근하지 않으니까 ...~~

python으로 이미 개발된 daemon을 수정해야 했는데, 생각보다 자료가 많지 않았다.

python daemonContext 참고자료

전체 구조

# python

import daemon
from daemon import pidfile


daemon_pid_file = '/var/run/daemon.pid'

def monitor():
    # 로그 파일을 읽고 파싱한 뒤, db에 저장하는 코드
    ...

def start_daemon():
    with daemon.DaemonContext(
        working_directory = '/tmp',
        umask = 0o002,
        pidfile = pidfile.TimeoutPIDLockFile(daemon_pid_file),
        ) as context:
        monitor() # 실행 하고자 하는 함수

*** working_directory** : default값은 '/', 데몬 시작 시 프로세스의 작업 디렉토리 경로라고 한다. 내 경우에는 centOS에서 데몬을 실행시킬 것이기 때문에 프로세스가 실행되는 위치를 '/tmp'로 설정한 듯 하다.

~~(사실 이전 인턴 분이 해두신 건데 /tmp말고 다른 위치로 뒀을 때도 문제없이 실행되는지 궁금하다.. 좀더 알아보고 나중에 한번 시도 해봐야지.. 지금은 잘못건드릴까 무섭다.)~~

*umask : default값은 0, 데몬 시작 시 프로세스에 대해 설정할 umask라고 한다.

(umask는 리눅스 파일에 기본 허가권을 설정하는 것이다. chmod로 하는 그거 ..)

*pidfile : default값은 None, 실행하는 데몬 코드의 pid를 저장하는 파일을 설정하는 것이다.

**pidfile.TimeoutPIDLockFile(daemon_pid_file) : 실행되는 데몬 프로세스의 pid가 저장될 파일인 daemon_pid_file을 TimeoutPIDLockFile로 설정함으로 해당 데몬 프로세스가 중복으로 실행되지 않도록 한다. 이걸 설정해두면 아무리 daemon start를 시켜도 pid가 여러개 생성되지 않고, 처음 start된 pid로 잠금되어 있다.
~~이 설정에 대한 정보 찾기가 제일 어려웠다~~

동작

start_daemon() 함수가 실행되면, /var/run/daemon.pid 파일이 생성되고, 해당 파일을 cat해보면 실행된 데몬의 pid를 확인할 수 있다.
이 pid는 daemon을 kill하거나 stop을 시키기 전 까지는 잠겨있다. 아무리 중복으로 start를 시켜도 pid는 더이상 생성되지 않는다는 뜻.

성공~

리눅스에서 특정 시간에 특정 작업을 하는 데몬을 cron이라 하고, 이 cron을 설정하는 것이 crontab 작업인데, 이는 다른 포스팅에서 다루겠다.

profile
경험 == 배움

2개의 댓글

comment-user-thumbnail
2021년 2월 23일

최고에요!

1개의 답글