daemon : 사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
서버 연결이 종료 되어도 백그라운드에서 계속해서 실행되기 때문에 나는 실시간으로 로그를 파싱하고 db에 저장하는 코드를 daemon으로 개발하였다. 나는 퇴근해도, 다른 직원 분들과 해커들은 퇴근하지 않으니까 ...
python으로 이미 개발된 daemon을 수정해야 했는데, 생각보다 자료가 많지 않았다.
# 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
작업인데, 이는 다른 포스팅에서 다루겠다.
최고에요!