2016-07-25 9 views
0

GitHub에서 반전 쉘 예제에서 daemonize()이라는이 방법을 발견했을 때 주위를 둘러 보았습니다. python example.py &이 같은 일을 달성하지 : 나는 확실히 그것은이 상황에서 무엇을, 같은 명령 줄에서이 코드를 실행하지 않는 것입니다 이해하지 못하는 어떤 source이 데몬 화 방법은 어떤 기능을합니까?

?

Deamonize 방법 소스 :

def daemonize(): 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit first parent 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit second parent 
+1

[프로그램을 데몬으로 실행하고 '&'를 사용하여 프로그램을 백그라운드로 포킹하는 것과의 차이점은 무엇입니까?] (http://unix.stackexchange.com/questions/56495/whats-the-difference-between-running -a-a-a-daemon-and-forking-it-into) –

답변

1

& 신호와 함께 python2.7 <file>.py을 실행하는 백그라운드 프로세스는 진정한 데몬 프로세스와 같은 것이 아닙니다.

진정한 데몬 프로세스 : 백그라운드에서

  • 실행됩니다. 이것은 &을 사용하고 유사성이 끝나는 곳에서도 발생합니다.
  • 터미널과 동일한 프로세스 그룹에 있지 않습니다. 터미널이 닫히면 데몬도 죽지 않습니다. 이것은 &에서 발생하지 않습니다. 프로세스가 동일하게 유지되며 단순히 백그라운드로 이동됩니다.
  • 상속받은 모든 파일 설명자 (입력, 출력 등)를 제대로 닫아 아무것도 부모와 다시 묶이지 않습니다. 다시 말하지만,이 메시지는 &에서 발생하지 않으며 터미널에 계속 쓰게됩니다.
  • SIGHUP이 아니라 SIGKILL 만 이상적으로 죽여야합니다. &으로 실행하면 SIGHUP이 프로세스를 종료 할 수 있습니다.

이 모든 그러나 학자 인이다. 몇 가지 작업을 수행하려면 이러한 속성에 필요한 극한 상태가 필요합니다. screen을 사용하는 새 터미널에서 생성되는 백그라운드 작업은 대개 덜 효율적이기는하지만 동일한 작업을 수행 할 수 있습니다. 또한 데몬이라고 부를 수도 있습니다. 장기 실행 백그라운드 작업. 사이의 진정한 차이점은 진정한 대몬은 단순히 잠재적 인 죽음의 모든 길을 피하려고 시도한다는 것입니다.

본 코드는 현재 프로세스를 포크합니다. 본질적으로 현재 프로세스를 복제하고 부모를 죽이고 현재 실행을 차단하지 않는 별도의 프로세스로 '백그라운드에서 작동합니다.'라고 묻는다면 추한 해킹이 가능하지만 작동합니다.

1

Orphan ProcessesDaemon Process에서보세요. 부모가없는 프로세스는 init의 자식이됩니다 (pid 1).

프로세스 그룹을 종료 할 때, 예를 들어 bash 인스턴스의 모든 하위 항목을 말할 때 운영 체제는 bash 인스턴스의 하위 항목에 대해 한숨 돌리고 있습니다. 이 경우와 같이 강제로 고아가되었거나 사고로 인해 고아가 된 사람은 치료를받지 못해 더 오래 머무를 것입니다.

관련 문제