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잠시 후 을 마운트 해제하려는 경우 /home데몬이 이를 방지합니다.

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

이는 데몬이 터미널 등에 오류 메시지를 기록하여 사용자를 혼란스럽게 하는 것을 방지하기 위한 것입니다. 데몬이 해야 할 일은 아마도 (구성된) 로그 파일을 열고 외부 세계와 통신하기 위해 원하는 모든 것을 쓰는 것입니다.

(이 함수는 분기하고, fork(2)가 성공하면 부모는 _exit(2)를 호출하여 자식만 추가 오류를 볼 수 있도록 합니다.)

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

이제 매뉴얼 페이지에서는 이를 명시적으로 언급하지 않지만 여기에 힌트가 있습니다(오류 아래).

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

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

변경 사항은 umask데몬과 관련이 없는 것 같습니다. 어쩌면 프로그램에 이에 대한 특별한 요구가 있을 수도 있습니다.

관련 정보