/etc/init.d에서 서비스를 설정하고 있습니다. 거기에서 다양한 스크립트를 보고 있는데 일부 start-stop-daemon ...
는 /path/to/script &
.
둘 다 pid를 파일에 저장하고 몇 가지 검사를 수행합니다.
모범 사례는 무엇이며, 차이점은 무엇이며, 여기서 무엇을 알아야 합니까...? (일반적으로 말하면)
내 특별한 경우에는 응용 프로그램이 한 시간에 한 번씩 호출하는 Java의 간단한 경량 로컬 호스트 http 서버가 있으며 이는 어리석은 임의의 숫자를 제공합니다. 여기에는 더 자세한 내용이 없습니다. 파일 시스템이나 스레드 등을 사용하지 않는다는 의미입니다. 내 질문에 대비해 복잡함)
감사해요
답변1
백그라운드 작업(즉, &로 시작하는 작업)의 stdin, stdout 및 stderr은 해당 작업이 시작된 터미널에 여전히 연결되어 있습니다. 갑자기 터미널에 (예: 오류 메시지) 쓰거나(포그라운드의 작업을 "방해") 키보드 입력을 기다리는 동안 일시 중지될 수 있습니다(먼저 포그라운드로 가져와야 함). 물론 stdout 및 stderr을 파일이나 /dev/null로 리디렉션하여 백그라운드 작업이 터미널에 기록되지 않도록 할 수 있습니다.
백그라운드 작업을 전경에 배치할 수도 있습니다. 현재 포그라운드 작업이 중지되고 fg
(포그라운드) 명령을 사용하여 백그라운드 작업을 포그라운드로 가져옵니다. 백그라운드 작업은 터미널의 신호를 통해 구현될 수도 있습니다. SIGHUP은 일반적으로 터미널을 닫을 때 터미널에서 시작된 (대부분의) 프로그램을 종료합니다.
반면에 데몬(예: init.d에 의해 자동으로 시작되지만 터미널에서 수동으로 시작할 수도 있음)은 터미널과의 연결이 끊어진 상태로 실행됩니다. 터미널에서 수동으로 시작하더라도 데몬은 터미널과의 연결이 끊겨서 쓰기(stdout, stderr)도, 읽기(stdin)도 할 수 없습니다. 또한 터미널에서 "자동으로" 전송된 신호에 "면역"됩니다. (그러나 를 사용하여 신호를 보낼 수는 있습니다 kill -signal pid
.)
"백그라운드" 및 "포그라운드"는 현재 터미널을 제어하는 프로세스인지 여부에 관계없이 터미널의 프로세스 상태를 나타냅니다. 데몬이 터미널에 연결되어 있지 않기 때문에(그러나 여러 가지 방법으로 터미널과 자동으로 연결이 끊어졌기 때문에) 백그라운드에서 실행 중이라고 할 수는 없습니다. 데몬은 포그라운드든 백그라운드든 터미널과 연결되지 않고 실행되는 단순한 프로세스입니다.
프로세스가 사용하는 터미널을 표시하는 옵션을 사용하면 ps
포그라운드 및 백그라운드 작업이 모두 터미널(예: tty2)과 연결되어 있음을 볼 수 있습니다. 반면에 데몬은 이 필드에 "?"를 갖습니다.
데몬은 수동으로 시작하더라도 일반적으로 이 작업을 수행합니다. 자신만의 데몬을 만드는 것은 꽤 힘든 작업입니다. 터미널에서 데몬을 완전히 연결 해제하려면 몇 가지 요령이 필요합니다. 이를 실행하려면 자체 사용자/그룹을 만들어야 합니다. 파일을 생성하려면 일반적으로 /tmp, /var/tmp 또는 /var/run을 사용해야 합니다. 일반적으로 다른 곳에서는 권한이 없어야 합니다. 터미널에 오류를 보고할 수 없으므로 오류를 로그 파일(예: /var/log에 있는 자체 로그 파일)에 기록해야 합니다. 데몬은 현재 PID를 사용하여 /var/run에 항목을 생성해야 하며 해당 항목의 다른 인스턴스가 이미 실행 중인지 확인해야 합니다. 해당되는 경우 파일이나 장치의 잠금(/var/lock)을 준수해야 합니다. 구성 파일을 다시 로드하고 업데이트된 구성을 사용하여 SIGHUP에 응답해야 합니다.
또 다른 요점은 대부분의 데몬이 작동하는 방식입니다. 데몬은 일반적으로 원래 데몬(상위 프로세스)이 부팅 시 시작되었는지 수동으로 시작되었는지 또는 해당 상위 프로세스 하위 프로세스에 의해 생성되었는지에 따라 두 가지 모드 중 하나로 실행될 수 있는 단일 실행 파일입니다. 상위 프로세스는 일반적으로 특정 시간, 경과 시간, 특정 네트워크 포트에 대한 연결 시도 또는 기타 이벤트와 같은 일부 이벤트를 기다립니다. 이런 일이 발생하면 상위 프로세스는 자신과 동일한 하위 프로세스를 생성하고(fork() 시스템 호출을 사용하여) 즉시 돌아와서 다른 이벤트를 기다리게 됩니다(그리고 더 많은 하위 프로세스를 생성할 수도 있음). 디스크 동기화, 명령 실행(예: cron
) 또는 네트워크 연결 설정( sshd
또는 ftpd
) 과 같은 작업을 실제로 수행하는 하위 프로세스입니다 . 부모 프로세스와 자식 프로세스의 유일한 차이점은 서로 다른 PID를 가지고 있다는 점이며, 자식 프로세스의 PPID(Parent-PID)는 부모 프로세스의 PID입니다. 이는 프로세스가 부모 프로세스인지 자식 프로세스인지 확인하는 데 사용될 수 있습니다. . 따라서 동일한 프로세스는 대기(및 생성) 상위 프로세스 또는 작업자 하위 프로세스의 두 가지 모드로 실행될 수 있어야 합니다.
데몬을 작성하는 것은 어렵지 않지만 사소한 일도 아닙니다. 보시다시피 먼저 알아야 할 "트릭"이 많이 있습니다. 일반적으로 데몬을 작성하려면 다른 대안에 비해 이득이 거의 없는 많은 노력이 필요하다고 생각합니다.
또는 백그라운드 작업을 사용하는 것은 nohup
일반적으로 터미널이 닫혀도 프로세스를 활성 상태로 유지하므로 충분한 선택입니다. disown
그러나 일반적으로 stdout 및 stderr을 파일이나 /dev/null로 리디렉션하는 것이 좋습니다. 더 많은 대화형 프로그램의 경우 screen
필요할 때까지 "방해되는" 항목을 두는 것이 좋습니다. at
, batch
또한 crontab
고려해 볼 가치가 있습니다.