서버 프로그램을 작성할 때 Ctrl+C를 누르거나 터미널을 닫으면 서버 프로그램이 종료되기 때문에 이 프로그램을 httpd와 같이 항상 백엔드에서 실행되는 데몬 프로세스로 만들까 생각했습니다. t 단말기의 영향을 받습니다.
데몬 프로세스는 httpd, mysqld와 같이 영어로 daemon이라고 부르며, 마지막 문자 d는 실제로 데몬을 의미합니다.
데몬 프로세스 작성 단계:
1. 하위 프로세스를 포크한 후 상위 프로세스가 종료됩니다. 이때 하위 프로세스는 init 프로세스에 의해 인수됩니다.
2. 하위 프로세스의 작업 디렉터리를 수정하고, 새 프로세스 조합과 새 세션을 만들고, umask를 수정합니다.
3. 자식 프로세스는 프로세스를 다시 분기한 후 손자 프로세스라고 부를 수 있으며, 그런 다음 자식 프로세스가 종료됩니다.
4. 손자 프로세스의 표준 입력 스트림, 표준 출력 스트림 및 표준 오류를 /dev/null로 리디렉션
위의 4단계를 완료하면 마지막 손자 프로세스를 데몬 프로세스라고 합니다. 먼저 코드를 작성하고 나중에 다음 단계의 이유를 분석하세요.
#!/usr/bin/env python #coding=utf8 def createDaemon(): import os, sys, time #产生子进程,而后父进程退出 try: pid = os.fork() if pid > 0:sys.exit(0) except OSError,error: print 'fork' sys.exit(1) #修改子进程工作目录 os.chdir("/") #创建新的会话,子进程成为会话的首进程 os.setsid() #修改工作目录的umask os.umask(0) #创建孙子进程,而后子进程退出 try: pid = os.fork() if pid > 0: print "Daemon PID %d"%pid sys.exit(0) except OSError,error: print "fork" sys.exit(1) run() def ping(): import os os.system('ping www.baidu.com >/dev/nul') def run(): while True: import time,threading fd = open('/home/ping.log', 'a') fd.write("start time---------:%s\n"%time.ctime()) fd.flush() t=threading.Thread(target=ping,args=()) t.start() time.sleep(3) fd.write("end of time--------:%s\n"%time.ctime()) fd.flush() fd.close() if __name__=='__main__': createDaemon()
1. 자식 프로세스를 Fork하고 부모 프로세스가 종료됩니다.
보통 서버 프로그램을 실행할 때 다음을 통해 서버에 연결합니다. 터미널에 성공적으로 연결되면 쉘 환경이 로드됩니다. 쉘 프로세스는 터미널 프로세스의 하위 프로세스로, ps 명령을 통해 쉽게 확인할 수 있습니다. 이 쉘 환경에서 실행되는 모든 하위 프로세스는 당연히 쉘 프로세스의 영향을 받게 됩니다. 쉘 프로세스의 경우 부모 프로세스가 종료되더라도 마찬가지입니다. 완료되면 생성된 하위 프로세스가 init 프로세스에 의해 인계되어 터미널 제어에서 벗어납니다.
2. 자식 프로세스의 작업 디렉터리 수정
자식 프로세스가 생성되면, 실행된 프로그램이 U 디스크에 있으면 U 디스크를 제거할 수 없습니다. .
3. 새 세션 만들기
setsid를 사용한 후 하위 프로세스는 새 세션의 첫 번째 프로세스가 되고 하위 프로세스는 새 프로세스 그룹의 리더 프로세스가 되며 하위 프로세스는 제어되지 않습니다. 터미널.
4. umask 수정
umask는 권한을 차단하므로 모든 것을 0으로 설정하면 파일을 읽고 쓸 때 권한 문제를 피할 수 있습니다.
5. 하위 프로세스가 종료됩니다. 위의 몇 단계 후에 하위 프로세스가 새 프로세스 그룹 보스가 되며 터미널 열기를 다시 신청할 수 있습니다. 이 문제를 방지하려면 손자 프로세스를 포크하세요.
6. 표준 입력 스트림을 리디렉션합니다. , 표준 출력 스트림, 손자 프로세스의 표준 오류는 /dev/null
데몬 프로세스이고 터미널에서 분리되었기 때문에 표준 입력 스트림, 표준 입력 스트림, 표준 오류로 흐릅니다. 스트림은 의미가 없으므로 모두 /dev/null로 리디렉션됩니다. 이는
다음으로 기록된 로그를 살펴보겠습니다