http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/Bash에서 프로세스를 데몬화하는 예를 제공합니다.
$ nohup firefox& &> /dev/null
내 말이 맞다면 명령은 "nohup 및 백그라운드 프로세스"와 동일합니다. 하지만 데몬 프로세스는 단순한 백그라운드 프로세스가 아닌가?
프로세스를 데몬화하기 위해 여기서 누락된 단계는 무엇입니까?
예를 들어 프로세스가 데몬화되면 상위 프로세스를 변경할 필요가 없나요? 그렇다면 bash에서는 어떻게 이 작업을 수행합니까? 아직 답변을 이해하려고 노력하는 중이에요https://unix.stackexchange.com/a/177361/674.
다른 단계와 조건은 무엇입니까?
답변1
Unix 환경에서 데몬의 상위 프로세스는 일반적으로 init 프로세스이지만 항상 그런 것은 아닙니다. 데몬은 일반적으로 자식 프로세스를 생성한 다음 즉시 종료하여 init가 자식 프로세스를 가져가게 하는 프로세스에 의해 생성되거나 init 프로세스가 데몬 프로세스를 직접 시작하는 프로세스에 의해 생성됩니다. 또한 분기 및 종료로 시작된 데몬은 일반적으로 제어 터미널(tty)에서 프로세스를 분리하는 등의 추가 작업을 수행해야 합니다. 이러한 프로세스는 일반적으로 다양하고 편리한 루틴으로 구현됩니다.데몬(3)유닉스에서.
daemon
해당 함수의 맨페이지를 읽어보세요 .
즉시 종료되는 셸에서 백그라운드 명령을 실행하면 프로세스의 PPID가 1이 됩니다. 테스트하기 쉬움:
# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
PID PPID PGID WINPID TTY UID STIME COMMAND
1936 1 9104 9552 cons0 1009 17:28:12 /usr/bin/sleep
보시다시피 프로세스는 PID 1에 속하지만 여전히 TTY와 연결되어 있습니다. 이 로그인 쉘에서 로그아웃했다가 다시 로그인하고 ps
다시 실행하면 TTY가 ?
.
여기에서 그 이유를 읽어보세요.TTY와 분리하는 것이 중요합니다..
사용 setsid
(의 일부 util-linux
):
# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
PID PPID PGID WINPID TTY UID STIME COMMAND
9864 1 9864 6632 ? 1009 17:40:35 /usr/bin/sleep
stdin, stdout 및 stderr를 리디렉션할 필요조차 없다고 생각합니다.
답변2
데몬 프로세스는 이름에서 알 수 있듯이 다음까지 실행되는 프로세스입니다.1.시스템이 종료되었습니다.2.중지해 달라고 요청하세요. 그 외에는 마법 같은 것이 없습니다.
이 경우 nohup을 사용하여 bash 스크립트를 백그라운드에서 실행하는 것은 데몬 프로세스로 분류될 수 있습니다.
무엇을 찾을 것으로 기대했지만 찾지 못했습니까? 문제가 발생하는 경우 추가 지원을 위해 샘플 코드 및 샘플 데이터 세그먼트를 사용하여 설명해 주세요. 현재 질문이 너무 광범위하거나 일반적입니다.