백그라운드 작업 (예 : &로 시작)에는 여전히 시작된 터미널에 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
, batch
및 crontab
도 재질 - 구글 번역 참고로 가치가있다.