파이썬 프로세스 지키기

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를 진행한다.
  • 새 세션을 생성합니다.
  • 호출 과정을 새 세션의 리더로 만듭니다.
  • 제어 터미널에서 처리가 끊깁니다.
  • 이로부터 알 수 있다.setsid () 를 호출하는 하위 프로세스는 새 세션 (세션의 새 프로세스 그룹) 의 리더가 되고 제어 터미널이 없습니다.그러나 기술적으로 제어 단말기를 세션2으로 재설정할 수 있다.

    두 번째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

    참고 자료


    서적.

  • 그렇구나. 유닛 프로세스. - 루비에서 배운 유닛의 기본.
  • Web

  • Unix 데몬의 구조
  • 전제는 호출된 프로세스가 프로세스 그룹의 지도자가 아니라는 것이다. 
    책에는 상세한 내용이 언급되지 않았다.Unix 데몬의 구조 이 글은 "예전System V과에서 세션 리더의 프로그램 이후에 제어 단말기에 연결될 수 있었기 때문에 역사적인 원인"이라고 썼다.라고 설명했다. 

    좋은 웹페이지 즐겨찾기