DAEMON(3)은 어떻게 작동하나요? 백그라운드 프로세스로 실행

DAEMON(3)은 어떻게 작동하나요? 백그라운드 프로세스로 실행

프로세스를 터미널에서 분리하는 단계는 무엇입니까? 이를 위해 맨 페이지를 찾았습니다.daemon()설명에서 그들은 언급했습니다.

nochdir이 0이면 daemon()은 프로세스의 현재 작업 디렉터리를 루트 디렉터리("/")로 변경합니다. 그렇지 않으면 현재 작업 디렉터리는 변경되지 않고 그대로 유지됩니다.

noclose가 0이면 daemon()은 표준 입력, 표준 출력 및 표준 오류를 /dev/null로 리디렉션합니다. 그렇지 않으면 이러한 파일 설명자가 변경되지 않습니다.

사실 저는 Python 코드를 데몬으로 실행하려고 했습니다. tcollector코드를 찾았습니다여기. 해당 코드에서도 설명과 동일한 단계를 따르고 있습니다 daemon(). 그래서 내 질문은, 우리가 왜 그런 단계를 수행해야 하는가입니다(wrtdaemonize()에서 tcollector)처럼

왜 , dir로 변경한 다음 으로 전화하는가 ?/umask022os.setsid()

답변1

실제로 당신이 인용한 것보다 더 많은 내용이 있지만 매뉴얼 페이지가 더 명확할 수 있다고 생각합니다.

nochdir이 0이면 daemon()프로세스의 현재 작업 디렉터리를 루트 디렉터리( /) 로 변경합니다.

여기서는 프로그램이 관리자 명령줄에서 시작된다고 가정하고 당시 관리자가 수행하던 작업에서 데몬을 분리하는 것이 아이디어입니다. 작업 디렉토리를 변경하면 /데몬이 마운트 지점을 계속 사용하는 것을 방지할 수 있습니다. 예를 들어 작업 디렉토리가 이고 /home/admin얼마 후 unmount 를 원했다면 /home데몬이 이를 방지할 것입니다.

noclose가 0이면 daemon()표준 입력, 표준 출력 및 표준 오류를 로 리디렉션합니다 /dev/null.

이는 데몬이 터미널에 오류 메시지 등을 기록하여 사용자를 혼란스럽게 하는 것을 방지하기 위한 것입니다. 데몬이 수행해야 할 작업은 일부(구성된) 로그 파일을 열고 외부와 통신하려는 내용을 거기에 기록하는 것입니다.

(이 함수는 분기하고, fork(2)가 성공하면 부모가 _exit(2)를 호출하므로 추가 오류는 자식에게만 표시됩니다.)

다시 말하지만, 관리자 셸 세션에서 연결을 해제하기 위해 기본 프로그램이 즉시 반환되고 다른 부분은 백그라운드에 유지되므로 프로그램이 백그라운드에서 시작되도록 명시적으로 요청할 필요가 없습니다(예: ./daemon &)

이제 매뉴얼 페이지에서는 명시적으로 설명하지 않지만 여기에 암시하는 내용(BUGS 아래)은 다음과 같습니다.

이 함수의 GNU C 라이브러리 구현은 BSD에서 가져왔으며 결과 데몬 프로세스를 보장하는 데 필요한 이중 포크 기술(즉, fork(2), setid(2), fork(2))을 사용하지 않습니다. 세션 리더가 아닙니다. 대신 결과 데몬은 세션 리더가 됩니다.

daemon()전화도 한다setsid()세션에서 자신을 해제하려면터미널 제어, 따라서 터미널에서 보낸 신호에서 발생합니다. 그러나 인용문에서 알 수 있듯이 터미널 장치를 열면 실수로 해당 장치를 제어 터미널로 가져올 가능성이 있습니다. 이를 방지하기 위해 일부 프로그램은 자식에서 를 호출 fork()setsid()다음 다시 포크하여 결과 프로세스가 세션 리더가 아니고(중간 프로세스는/였음) 제어 터미널을 얻을 수 없도록 두 부모를 모두 종료합니다. 당신이 언급한 Python 프로그램이 바로 그 일을 합니다.

변경하는 것은 umask데몬화와 관련이 없는 것 같습니다. 아마도 그 프로그램에는 특별한 필요성이 있을 것입니다.

관련 정보