Python 이 데 몬 을 어떻게 실현 하 는 지 예시
python 서비스 프로그램 을 만 들 었 고 명령 행 에서 시 작 했 습 니 다.명령 행 세 션 은 터미널 에 의 해 제어 되 었 습 니 다.python 서 비 스 는 터미널 프로그램의 키 프로 세 스 가 되 었 습 니 다.따라서 터미널 을 닫 으 면 이 명령 행 프로그램 도 닫 힙 니 다.
python 서 비 스 를 터미널 의 영향 을 받 지 않 고 상주 시 키 려 면 데 몬 으로 바 꿔 야 합 니 다.
데 몬 프로 세 스 는 Daemon 프로그램 으로 시스템 배경 에서 실행 되 는 프로그램 입 니 다.터미널 을 제어 하고 주기 적 인 작업 이나 트리거 이 벤트 를 수행 합 니 다.흔히 볼 수 있 는 httpd,syslogd,systemd,dockerd 등'd'자모 로 끝 납 니 다.
코드 구현
python 은 데 몬 을 간결 하 게 구현 할 수 있 습 니 다.코드 와 설명 을 먼저 드 리 겠 습 니 다.
# coding=utf8
import os
import sys
import atexit
def daemonize(pid_file=None):
"""
:param pid_file: id
:return:
"""
# fork
pid = os.fork()
# pid 0, 0
if pid:
# ,sys.exit() os._exit()
sys.exit(0)
# , ,
os.chdir('/')
# umask( ), 0( ),
os.umask(0)
#
os.setsid()
# , 2 fork, ,
_pid = os.fork()
if _pid:
#
sys.exit(0)
# , , 、 、 ( , print )
# ,
sys.stdout.flush()
sys.stderr.flush()
# dup2 , /dev/nul,
with open('/dev/null') as read_null, open('/dev/null', 'w') as write_null:
os.dup2(read_null.fileno(), sys.stdin.fileno())
os.dup2(write_null.fileno(), sys.stdout.fileno())
os.dup2(write_null.fileno(), sys.stderr.fileno())
# pid
if pid_file:
with open(pid_file, 'w+') as f:
f.write(str(os.getpid()))
# , pid
atexit.register(os.remove, pid_file)
데 몬 의 작성 절 차 를 요약 합 니 다:왜 포크 를 두 번 해?
첫 번 째 포크 는 터미널 제어 에서 벗 어 나 기 위 한 마수 입 니 다.부모 프로 세 스 가 종료 한 이 유 는 터미널 이 키 보드 를 두 드 리 거나 닫 을 때 신 호 를 보 냈 기 때 문 입 니 다.한편,fork 에서 나 온 하위 프로 세 스 는 아버지 프로 세 스 가 자살 한 후에 고아 프로 세 스 가 되 어 운영 체제 의 init 프로 세 스 에 의 해 연결 되 어 단말기 제어 에서 벗 어 났 다.
그래서 두 번 째 포크 는 꼭 필요 한 것 이 아 닙 니 다.프로 세 스 가 제어 단말 기 를 다시 열지 않도록 신중하게 고려 했 을 뿐이다.하위 프로 세 스 는 현재 세 션 팀장(대화 기의 첫 프로 세 스)이기 때문에 제어 단말 기 를 열 수 있 습 니 다.다시 fork 하면 손자 프로 세 스 는 제어 단말 기 를 열 수 없습니다.
파일 설명자
리 눅 스 는"모든 파일"입 니 다.파일 설명 자 는 커 널 이 열 린 파일 을 위 한 색인 입 니 다.보통 마이너스 정수 입 니 다.프로 세 스 는 파일 설명 자 를 통 해 IO 작업 을 수행 합 니 다.
기본 적 인 상황 에서 0 은 표준 입력 을 대표 하고 1 은 표준 출력 을 대표 하 며 2 는 표준 오 류 를 대표 합 니 다.
umask 권한 마스크
리 눅 스에 서 는 모든 파일 에 읽 기(read),쓰기(write),실행(execute)의 세 가지 사용 권한 이 있다 는 것 을 알 고 있 습 니 다.그 중에서 읽 기 권한 은 숫자 4 로 대표 되 고 쓰기 권한 은 2 이 며 실행 권한 은 1 이다.명령 ls-l 은 파일 권한 을 볼 수 있 고 r/w/x 는 각각 읽 기/쓰기/실행 권한 이 있 음 을 표시 합 니 다.
모든 파일 에는 사용자(User),사용자 그룹(Group),다른 그룹(Others)세 가지 신분 권한 이 있 습 니 다.일반적으로 세 개의 숫자 로 파일 권한 을 표시 합 니 다.예 를 들 어 754:
7,사용자 권한,즉 파일 소유자 권한
5,Group 권한,소유자 가 있 는 사용자 그룹의 구성원 이 가 진 권한
4.Others 권한,즉 다른 그룹 사용자 의 권한 입 니 다.
umask 는 기본 권한 을 제어 하기 위해 새 파일 이나 폴 더 가 전권 을 가지 지 않도록 합 니 다.
시스템 은 일반적으로 022(명령 umask 로 보기)로 기본 파일 을 만 들 수 있 는 권한 은 644 이 고 폴 더 는 755 입 니 다.파일 권한 과 umask 의 추가 결 과 는 666(웃음)이 고 폴 더 권한 과 umask 의 추가 결 과 는 777 이라는 규칙 을 알 수 있 을 것 이다.
프로 세 스 그룹
모든 프로 세 스 는 하나의 프로 세 스 그룹(PG,Process Group)에 속 하 며,프로 세 스 그룹 은 여러 프로 세 스 를 포함 할 수 있 습 니 다.
프로 세 스 그룹 에는 프로 세 스 팀장(Leader)이 있 습 니 다.프로 세 스 팀장 의 ID(PID,Process ID)는 전체 프로 세 스 그룹의 ID(PGID,Process Groupd ID)입 니 다.
세 션 그룹
터미널 에 로그 인 할 때 세 션 을 만 듭 니 다.여러 프로 세 스 그룹 이 세 션 에 포 함 될 수 있 습 니 다.세 션 을 만 드 는 프로 세 스 는 세 션 팀장 입 니 다.
세 션 팀장 의 프로 세 스 입 니 다.setsid()방법 으로 세 션 을 만 들 수 없습니다.따라서 위의 코드 에서 하위 프로 세 스 는 setsid()를 호출 할 수 있 으 며,부모 프로 세 스 는 세 션 팀장 이기 때문에 사용 할 수 없습니다.
또한,sh(Bourne Shell)는 세 션 체 제 를 지원 하지 않 습 니 다.세 션 체 제 는 셸 이 작업 제어(Job Control)를 지원 해 야 하기 때 문 입 니 다.
데 몬 과 배경 프로 세 스
&기 호 를 통 해 명령 을 배경 에 놓 고 실행 할 수 있 습 니 다.데 몬 과 는 다 릅 니 다:
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.