파이썬 프로세스 지키기
12047 단어 Python
개시하다
나는 책 한 권그렇구나. 유닛 프로세스. - 루비에서 배운 유닛의 기본.을 읽었다.프로세스라는 개념은 루비의 코드로 설명한다.아주 알기 쉬운 책이 나를 감동시켰다
복습을 위해서, 나는 책 속의 일부 루비 코드를 파이톤으로 바꾸고 싶다.가까스로 가장 실용적인 프로세스 수호 프로세스를 실현했다.
코드 from datetime import datetime
import os
import sys
import time
def daemonize():
"""
プロセスをデーモン化する。
"""
def fork():
if os.fork():
sys.exit()
def throw_away_io():
stdin = open(os.devnull, 'rb')
stdout = open(os.devnull, 'ab+')
stderr = open(os.devnull, 'ab+', 0)
for (null_io, std_io) in zip((stdin, stdout, stderr),
(sys.stdin, sys.stdout, sys.stderr)):
os.dup2(null_io.fileno(), std_io.fileno())
fork()
os.setsid()
fork()
throw_away_io()
def create_empty_file():
"""
現在時刻をファイル名としたテキストファイルを出力する。
ファイルにはこのファイルを出力したプロセス pid が入力される。
"""
now = datetime.now().strftime('%Y%m%d%H%M%S')
filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)),
f'tmp/{now}.txt')
with open(filepath, 'w') as f:
f.write(str(os.getpid()))
def create_empty_files(interval=60):
"""
interval 秒ごとに create_empty_file() を呼び出す。
"""
while True:
create_empty_file()
time.sleep(interval)
if __name__ == '__main__':
daemonize()
create_empty_files()
데모니즈()에 대한 설명
최초의 os.fork 정보()
상기 코드 중fork() 두 번이라고 부른다.def fork()
if os.fork():
sys.exit()
os.fork()에서 부모 프로세스는 하위 프로세스의pid를 되돌려주고 하위 프로세스는 0을 되돌려줍니다.즉, 상위 프로세스가 끝나고 하위 프로세스가 계속 존재한다는 것이다.
os.setsid 정보()
os.setsid() 이름과 같이 setsid() 시스템 호출을 호출합니다.그리고 setsid()는 다음 세 가지 처리1를 진행한다.
from datetime import datetime
import os
import sys
import time
def daemonize():
"""
プロセスをデーモン化する。
"""
def fork():
if os.fork():
sys.exit()
def throw_away_io():
stdin = open(os.devnull, 'rb')
stdout = open(os.devnull, 'ab+')
stderr = open(os.devnull, 'ab+', 0)
for (null_io, std_io) in zip((stdin, stdout, stderr),
(sys.stdin, sys.stdout, sys.stderr)):
os.dup2(null_io.fileno(), std_io.fileno())
fork()
os.setsid()
fork()
throw_away_io()
def create_empty_file():
"""
現在時刻をファイル名としたテキストファイルを出力する。
ファイルにはこのファイルを出力したプロセス pid が入力される。
"""
now = datetime.now().strftime('%Y%m%d%H%M%S')
filepath = os.path.join(os.path.dirname(os.path.abspath(__file__)),
f'tmp/{now}.txt')
with open(filepath, 'w') as f:
f.write(str(os.getpid()))
def create_empty_files(interval=60):
"""
interval 秒ごとに create_empty_file() を呼び出す。
"""
while True:
create_empty_file()
time.sleep(interval)
if __name__ == '__main__':
daemonize()
create_empty_files()
데모니즈()에 대한 설명
최초의 os.fork 정보()
상기 코드 중fork() 두 번이라고 부른다.
def fork()
if os.fork():
sys.exit()
os.fork()에서 부모 프로세스는 하위 프로세스의pid를 되돌려주고 하위 프로세스는 0을 되돌려줍니다.즉, 상위 프로세스가 끝나고 하위 프로세스가 계속 존재한다는 것이다.os.setsid 정보()
os.setsid() 이름과 같이 setsid() 시스템 호출을 호출합니다.그리고 setsid()는 다음 세 가지 처리1를 진행한다.
두 번째os.fork 정보()
두 번째os.fork ()에서 세션과 처리팀의 리더가 된 프로세스가 끝나고 새로운 하위 프로세스를 생성합니다.종료된 세션 리더는 제어 단말기가 없고, 새로운 하위 프로세스는 세션 리더가 아닙니다. 제어 단말기가 없다는 것을 보장할 수 없습니다.데몬이 완료되었습니다.
throw_away_정보
def throw_away_io():
stdin = open(os.devnull, 'rb')
stdout = open(os.devnull, 'ab+')
stderr = open(os.devnull, 'ab+', 0)
for (null_io, std_io) in zip((stdin, stdout, stderr),
(sys.stdin, sys.stdout, sys.stderr)):
os.dup2(null_io.fileno(), std_io.fileno())
표준 흐름을 모두 /dev/null
보낸 후 버립니다.데몬에 제어 터미널이 없기 때문에 더 이상 이 자원이 필요하지 않습니다.여기서close표준흐름/dev/null
발송이 아니라 표준흐름의 이용을 가정한 외부 프로그램을 고려하여 외부에서 보아도 표준흐름을 사용할 수 있도록 하기 위해서다.실행 결과 $ python main.py
$ ps aux | grep -v grep | grep python
quanon 4621 0.0 0.0 2418360 2996 ?? S 11:46PM 0:00.00 python main.py
$ cat tmp/20170520234627.txt
4621⏎
수동 데몬이 백그라운드에서 계속 작동
최후
기분 좋으면 읽고 싶은 코드python-daemon
참고 자료
서적.
$ python main.py
$ ps aux | grep -v grep | grep python
quanon 4621 0.0 0.0 2418360 2996 ?? S 11:46PM 0:00.00 python main.py
$ cat tmp/20170520234627.txt
4621⏎
기분 좋으면 읽고 싶은 코드python-daemon
참고 자료
서적.
Web
책에는 상세한 내용이 언급되지 않았다.Unix 데몬의 구조 이 글은 "예전System V과에서 세션 리더의 프로그램 이후에 제어 단말기에 연결될 수 있었기 때문에 역사적인 원인"이라고 썼다.라고 설명했다. ↩
Reference
이 문제에 관하여(파이썬 프로세스 지키기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/QUANON/items/71f606216f84371a0d04텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)