시스템 관리자의 관점에서 UNIX 기반 시스템에 서비스를 배포할 때 실질적인 차이점은 무엇입니까?
답변1
데몬의 경우 원하는 것은 어떤 것에도 얽매이지 않는 프로세스입니다. 최소한 터미널에 연결되지 않고 자체 세션에 있고, 아무것도 열지 않는 부모로부터 상속된 파일 설명자가 없고, 현재 디렉토리를 소유하는 부모(init 제외)가 사용자를 돌보지 않기를 원합니다 /
. 제거 방지...
터미널에서 분리하려면 새 세션을 만들어야 합니다. 그러나 세션을 만들려면 그룹(또는 세션) 리더가 될 수 없으므로 새 프로세스를 포크하는 것이 좋습니다. 상위 프로세스가 종료된다고 가정하면 이는 해당 프로세스에 더 이상 상위 프로세스가 없으며 init에 의해 채택된다는 의미이기도 합니다. 그런 다음 가능한 모든 파일 설명자를 닫습니다 chdir("/")
(닫을 수 없음).폐쇄현재 작업 디렉터리는 파일 설명자와 마찬가지로 해당 리소스를 해제하여 /
적어도 현재 작업 디렉터리가 디렉터리 언로드를 방해하지 않도록 합니다.
이 프로세스는 세션 리더이기 때문에 터미널 장치를 열면 해당 터미널에 대한 제어 프로세스가 될 위험이 있습니다. 두 번째 포크는 이런 일이 발생하지 않도록 보장합니다.
반면, 대화형 셸에서는 새 프로세스 그룹을 분기하고 생성합니다(터미널의 전경 프로세스 그룹에 속하지 않도록). 비대화형 셸에서는 프로세스를 분기하고 그 안에 있는 SIGINT를 무시합니다. 터미널에서 분리되지 않고 파일 설명자를 닫지 않습니다(일부 쉘은 표준 입력을 다시 열지만 /dev/null
)...
답변2
전통적인 데몬 접근 방식은 다음과 같습니다.
fork()
setsid()
close(0) /* and /dev/null as fd 0, 1 and 2 */
close(1)
close(2)
fork()
이렇게 하면 프로세스가 더 이상 터미널과 동일한 프로세스 그룹에 있지 않으므로 터미널과 함께 종료되지 않습니다. IO 리디렉션은 출력이 터미널에 표시되는 것을 방지하는 것입니다.
답변3
프로그램/프로세스를 데몬으로 실행하는 것과 & 기호를 사용하여 백그라운드로 포크하는 것의 차이점은 기본적으로 소유권에 관한 것입니다.
가장 일반적으로 데몬의 상위 프로세스는 다음과 같습니다.내부에프로세스(Unix 시스템에서 시작된 첫 번째 프로세스)에서 데몬은 해당 프로세스의 하위입니다. 즉, 권한이 없는 사용자로서 직접 제어할 수 없습니다. 반면에 프로그램/프로세스를 백그라운드로 분기한다는 것은 언제든지 이를 다시 포그라운드로 호출하거나 종료할 수 있음을 의미합니다.
답변4
상위 프로세스가 종료되면 SIGHUP 신호에 의해 프로세스가 command &
종료됩니다.
프로그램이 "데몬 모드"를 명시적으로 지원하지 않는 경우(즉, HUP 신호를 무시하는 경우) 시스템 관리자는 여전히 일부 해결 방법에 액세스할 수 있습니다.
Bash 시스템에서는 다음을 사용할 수 있습니다.
(trap '' HUP; command) &
그러면 하위 쉘이 열리고 HUP
빈 핸들러로 신호를 포착한 후 앰퍼샌드/포크합니다.
출력이 여전히 잘못된 출력으로 리디렉션될 수 있습니다 tty
. 아니면 길을 잃거나. 또는 및를 사용하여 문제를 해결할
수 있습니다 .&>command.out
1>output.out
2>errors.out
대부분의 시스템에서는 이 명령에 액세스할 수도 있습니다 nohup
.
nohup
이 프로세스는 크게 단순화되었습니다. 이것은 상당히 표준적이지만 많은 비지박스 내장 ARM 배포판에서는 이 기능이 누락되어 있습니다. 다음과 같이 작성하면 됩니다.
nohup command &
..끝났어요. 출력은 IIRC로 리디렉션되지만 nohup.out
이 파일 이름은 옵션을 사용하여 변경할 수 있습니다.