%EC%9D%80%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%EC%9E%91%EB%8F%99%ED%95%98%EB%82%98%EC%9A%94%3F%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A1%9C%20%EC%8B%A4%ED%96%89.png)
프로세스를 터미널에서 분리하는 단계는 무엇입니까? 이를 위해 맨 페이지를 찾았습니다.daemon()
설명에서 그들은 언급했습니다.
nochdir이 0이면 daemon()은 프로세스의 현재 작업 디렉터리를 루트 디렉터리("/")로 변경합니다. 그렇지 않으면 현재 작업 디렉터리는 변경되지 않고 그대로 유지됩니다.
noclose가 0이면 daemon()은 표준 입력, 표준 출력 및 표준 오류를 /dev/null로 리디렉션합니다. 그렇지 않으면 이러한 파일 설명자가 변경되지 않습니다.
사실 저는 Python 코드를 데몬으로 실행하려고 했습니다. tcollector
코드를 찾았습니다여기. 해당 코드에서도 설명과 동일한 단계를 따르고 있습니다 daemon()
. 그래서 내 질문은, 우리가 왜 그런 단계를 수행해야 하는가입니다(wrtdaemonize()
에서 tcollector
)처럼
왜 , dir
로 변경한 다음 으로 전화하는가 ?/
umask
022
os.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
데몬화와 관련이 없는 것 같습니다. 아마도 그 프로그램에는 특별한 필요성이 있을 것입니다.