start-stop-daemon과 &로 달리는 것의 차이점은 무엇입니까?


18

/etc/init.d에서 서비스를 설정하고 있습니다. 나는 거기에 다양한 스크립트를보고 있으며, 일부는로 구현되고 일부는로 구현 start-stop-daemon ...됩니다 /path/to/script &.

그들 모두는 pid를 파일로 저장하고 검사를합니다.

모범 사례는 무엇이며 차이점은 무엇이며 여기서 알아야 할 중요한 사항은 무엇입니까? (일반적으로)

내 특별한 경우에는 응용 프로그램이 매 시간마다 한 번씩 호출되는 간단한 경량 localhost http 서버가 있으며 바보 같은 난수를 제공합니다 (자세한 내용은 여기에서 파일 시스템을 사용하지 않는다는 것을 의미합니다. 내 질문 에이 문제가 발생할 경우 스레드 또는 복잡한 것)

감사

답변:


27

백그라운드 작업 (예 : &로 시작)에는 여전히 시작된 터미널에 stdin, stdout 및 stderr가 연결되어 있습니다. 터미널에 갑자기 쓰기 (예 : 오류 메시지) 될 수 있습니다 (예 : 포 그라운드로 이동)하거나 키보드에서 입력을 기다리는 것을 일시 중지합니다 (먼저 포 그라운드에 입력해야 함). 물론 백그라운드 작업이 터미널에 쓰지 않도록 stdout 및 stderr을 파일 또는 / dev / null로 리디렉션 할 수 있습니다.

백그라운드 작업도 포 그라운드로 배치 할 수 있습니다 (예 : 현재 포 그라운드 작업이 중지되고 fg(foreground) 명령이 포 그라운드에 백그라운드 작업을 배치하는 데 사용됩니다. 또한 백그라운드 작업은 터미널의 신호를 통해 도달 할 수 있습니다 (예 : 터미널을 닫을 때 SIGHUP, 보통 터미널에서 시작된 대부분의 프로그램이 종료됩니다.

데몬은 init.d에 의해 자동으로 시작된 것과 비슷하지만 터미널에서 수동으로 시작할 수도 있습니다. 반면에 어떤 데몬에서도 연결이 끊어집니다. 터미널에서 수동으로 시작된 경우에도 데몬은 터미널에서 연결이 끊어 지므로 쓰기 (stdout, stderr) 나 읽기 (stdin) 할 수 없습니다. 또한 터미널이 "자동으로"보낸 신호에 대해서는 "면역"입니다. (당신이 사용하여 신호를 보낼 수 있지만 kill -signal pid).

"배경"및 "전경"은 일부 터미널에 대한 프로세스 상태를 나타냅니다. 현재 터미널을 제어하는 ​​프로세스인지 여부입니다. 데몬은 터미널에 연결되어 있지 않기 때문에 (모든 방식에서 실제로 연결이 끊어졌습니다) 백그라운드에서 실행되고 있다고 말할 수 없습니다. 데몬은 터미널과 연결되지 않고 실행되는 프로세스입니다.

당신이 사용하는 경우 ps옵션과 함께 쇼는 A 단말기 과정에서 사용하는, 당신은 앞 - 모두가 backgroundjobs이 터미널 (예를 들면.에서 tty2)로 assosciated되는 것을 볼 수있다. 반면에 데몬은 "?" 이 분야에서.

데몬은 일반적으로 수동으로 시작 되더라도 그대로 작동합니다. 자신의 데몬을 만드는 것은 꽤 많은 작업입니다. 터미널에서 완전히 연결을 끊는 데는 약간의 속임수가 있습니다. 실행하려면 자신의 사용자 / 그룹을 만들어야합니다. 파일을 만들려면 일반적으로 / 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, batchcrontab도 재질 - 구글 번역 참고로 가치가있다.


1
또한 오래된 유닉스 시스템 과정에서, 터미널에서 시작할 때 서버는 [프로세스 그룹] [ en.wikipedia.org/wiki/Process_group]을 떠나야한다는 것을 기억합니다 . 내가 기억하기로는. 따라서 프로세스는 원래 터미널의 모든 신호에 영향을 미치지 않습니다.
yves Baumes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.