티스토리 뷰

비기너 백엔드 프로그래머 지망생입니다. 문화를 사랑하고 전문가를 지향합니다.

 

최근의 백그라운드 프로그램은 많은 영역에서 사용되고 있습니다. 웹 서버부터 시스템 감시 툴까지 다양한 영역에서 사용되고 있는 백그라운드 프로그램은 데몬이라는 프로세스 개념을 기본으로 동작합니다.

본 세션은 *nix 계열 운영체제 사용자이면서, 서비스나 데몬 등을 사용하여 보았고. 이를 만들어 보고 싶은 사람들을 대상으로 합니다.

따라서 본 발표는 다음과 같은 지식을 선수합니다. 필수:

  • *nix계열 운영체제 사용 경험(linux, BSD, macOS)
  • *nix계열의 파일 시스템 개념
  • 파이썬 기초 문법
  • 파이썬 패키징

선택:

  • 프로세스에 대한 기본적인 이해

https://www.pycon.kr/program/talk-detail?id=48

 

 


벌써 마지막 자리.

파이콘의 대장정의 막을 내리는 자리.

삽질을 좋아한다.

현재 대학에 재학중..

오늘 주제는 데몬 만들기

 

---

 

데몬?

 

악마가 아닌 시스템 프로그램의 데몬

사용자의 직집적 제어없이 백그라운드에서 혼자 스스로 작동하는 프로세스.

엔진X, 도커D(데몬) 등 이벤트가 발생할 때 작동하는 프로그램

 

데몬의 조건

  • 부모 프로세스가 init이고 자산이 세션/그룹의 리더여야 함.
  • 연결된 터미널이나 디스크립터가 없음.

즉 사용자가 제어할 수 있으면 안된다. 완전히 독립되어야 함.

 

 

fork를 이용한 프로세스 복제

fork 기본 내장되어 있는 os모듈을 이용.

자기 프로세스를 복제하여 자식으로 만드는 sys call.

부모가 fork를 하면, 자식은 pid에 0을 가지는 특징이 있음

 

부모프로세스 강제 종료

pid가 0보다 큰 경우로 설정.

0이상이면 자체 종료, 아닐 경우프로세스가 진행.

 

프로세스 그룹과 세션을 생성

자기를 init프로세스에 입양을 감.

os.chdir('/')으로 루트 디렉토리로 작업공간을 변경.

usb나 다른 디바이스 등 어디서 실행될지 모르는데 이를 통일화.

데몬이면 시스템 방식을 따라야 하니까 루트를 작업공간으로 설정.

usb를 꽂고 실행하면 프로세스가 이를 잡고 있으면 마운트가 불가. 

이런 문제들을 막기 위해 루트 디렉토리로 변경.

 

setid()

새로운 세션을 생성하고 리더가 된다.

사용자가 제아할 만한 터미널이 없어진다.

입려출력에 영향을 받지 않음.

이 과정을 거쳐 init 프로세스에 입양.

 

umask()

파일을 새로 생성할 때 퍼미션을 지정함.

영으로 하는 이유는 루트권한으로 실행되는데, 

다른 사용자가 수정 및 읽을 수 없으면 실행여부를 알 수 없기 때문에.

유마스크로 0제로 옵션으로 하면 777권한이 생김.

 

소유하고 있는 입출력 디스크립터를 해제.

어떤 파일도 잡고 있으면 안됨.

무슨 파일을 잡고 있는지 몰라 삭제가 되지 않는 문제가 생김

그래서 모든 연결을 해제해야 함.

 

os.dup2(df,fd2)

복제하고 가능하면 닫음

표준 입,출력과 에러를 전부 /dev/null 디스크립터를 가리키게 함.

이렇게 하는 방법밖에 없는데

stdi = open(os.devnull, 'r') 식으로 r, a+, a+ 3가지를 만듬

3개를 생성해서 3개 전부 리다이렉트를 해줌.

 

뒤에 atexit는 프로세스가 죽으면 실행하는 콛,

 

 

getid()

프로세스가 종료되기 전에 pid를 pidfile에 저장

이걸로 기존의 데몬을 제어.

 

전체 코드도 있으며, 해당 출처에서 확인 가능

 

 

def start()

pid를 불러옴. 데몬이 실행되고 있는지 검사.

실제로 실행되고 있는지 검사하려면 ps -p{pid} -o comm 식으로 조회가능.

 

self.run()

이제 함수를 불러와서 실행.

이제 실제 어플리케이션이 시작됨.

 

def sop()

pidfile이 존재하지 않으면 종료한다.

만약 pid가 있으면 kill명령어를 지속적으로 요청. 꺼질때 까지.

 

 

간단한 예시

이것을 활용하여 어플리케이션을 만들어 볼 차례.

 

 

확인해보니 정상적으로 텍스트 파일이 생성됨

 

 

응용예제

비트로커

암호화 기능. 이걸 리눅스 환경에서 gui로 설정.

 

get_disks()

연결된 파티션을 관리함.

실제로 암호화가 되어 있으면 gui를 띄움.

 

----

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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 29 30
글 보관함