일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- Raspbian
- 아두이노 fingerprint
- Apache
- 구글 클라우드 플랫폼
- 라즈베리파이
- 아두이노
- js 반복문
- MariaDB
- js 내부함수
- 아두이노 https
- 리디렉션
- js 내부함수 반복문
- redirect
- js for 반복문
- 라즈베리파이 3b+
- 아두이노 DB
- 리다이렉트
- 리디렉트
- Centos Node js
- 아두이노 https post
- CentOS8
- 아두이노 ESP8266
- Today
- Total
dinist
파이썬 데몬 프로그램 만들기 본문
2020/12/13 - [개발?/파이썬] - logging, signal, argparse 모듈 사용해보기
logging, signal, argparse 모듈 사용해보기
파이썬으로 리눅스에 데몬을 띄우는것에 대해 찾아보고 있었는데 좋은 정보가 있는 블로그를 찾았다. 우선 코드부터 이해하고 연습하고나서 데몬을 띄우든 뭘 하든 해야겠다. 참고 링크 1 : mediu
dinist.tistory.com
위 모듈을 사용한 간단한 파이썬 프로그램을 만들어봤는데 이를 데몬으로 만들어서 실행해보는것을 기록한다.
우선 위 글에서 작성했던 소스코드를 기반으로 내용을 수정했다.
클래스명도 Teller에서 Say로 변경했다.
변경된 소스코드는 다음과같다.
다음은 데몬으로 등록하기위한 service 파일을 생성한다.
[Unit]
Description=forker Service.
[Service]
Type=forking
ExecStart=/usr/bin/python3 /opt/forworker/forker.py -log /var/log/forworker/log.log -Say "Hi hello" -Sleep 1
Restart=always
PIDFile=/var/run/forker.pid
WorkingDirectory=/opt/forworker/
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
service 파일의 파일명은 forker.service로 지정한다.
모두 작성이 완료되면 이 파일을 /etc/systemd/system/ 디렉터리에 복사한다.
이후 /opt/forworker/ 디렉터리에
Say.py와 forker.py 파일을 복사한다.
이후 다음과같은 명령을 통해 데몬 등록을 진행한다.
systemctl daemon-reload
systemctl enable forker
systemctl start forker
enable이후 start이후에 별 다른 오류가 없다면 systemctl status forker 명령으로 한번 더 상태를 확인해본다.
Active상태로 잘 작동중이다. 이 데몬으로 작동중인 파이썬 프로그램의 로그는 /var/log/forworker/log.log에 저장중이다.
확인해보자
로그도 잘 나오고 있다.
근데 계속 실행중이므로 로그가 계속 쌓일것이다. 이제 선택의 순간에 직면했다.
데몬을 계속 켜놓고 로그를 logrotate로 관리할것이냐 그냥 데몬을 죽일것이냐
(대충 막 만든 프로그램이니 이런 테스트용 로그가 막 쌓이지 실제 개발에서는 이런경우는 거의 없을 것이다.)
두가지 다 해보자!
먼저 데몬을 종료해보자.
systemctl stop forker 명령으로 데몬을 종료해본다.
상태가 inactive (dead) 라고 되어있다. 종료되었다.
로그도 더이상 쌓이지 않을것이다.
이제 두번째 경우인 logrotate를 이용한 로그 관리이다.
logrotate는 로그파일의 개수를 기준으로 잡거나 로그파일의 크기를 기준으로 잡는등 다양한 기준으로 로그를
관리할 수 있다. 최대 생성가능한 로그파일의 개수를 지정할 수도 있고, 그 관리주기도 정할 수 있다.
간단하게 logrotate를 사용해보자. 내용은 이렇게 작성했다.
/var/log/forworker/*.log{
daily
rotate 10
size 1000
missingok
notifempty
create 666 root root
}
각각의 항목에 대해 알아보자
맨 윗줄의 /var/log/forworker/*.log 부분은 해당경로의 모든 log파일에 대해 아래와같은 정책을 적용하겠다는 의미이다.
daily는 하루 단위로 로그를 순환한다는 의미이다. daily대신 weekly monthly yearly등이 올 수 있다.
rotate 10 은 순환파일의 최대 개수를 지정한다. 앞서 맨위에서 daily라고 지정했으므로 매일 1개의 log파일이 생성되는데 10일이 초과되면 로그파일이 순환한다는 의미이다.
size 1000는 순환되는 로그파일의 크기가 1000에 도달하면 순환을 실행한다는 의미이다.
여기에는 100K 100M 100G 등의 단위도 붙을 수 있다.
missingok는 로그파일이 존재하지 않아도 오류를 발생하지 않도록 하는것이다.
notifempty는 로그의 내용이 없으면 rotate작업을 하지 않는다는 의미이다.
create 666 root root는 rotate되는 log파일을 root 사용자 root 그룹의 666 권한으로 만들겠다는 의미이다.