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 작업인데, 이는 다른 포스팅에서 다루겠다.
최고에요!