2017-03-10 14 views
0

일단 제어 터미널에서 분리되면 데몬을 사용할 수 없으므로 데몬이 stdout (및 stderr)에 쓰지 않아야 함을 이해합니다. 하지만 내 원래 로깅을 계속 사용할 수 있도록 stdout을 일반 파일로 다시 열 수 있습니까? 이것은 나를 위해 아주 좋고 유용 할 것입니다. 리눅스 데몬의 표준 파일로 stdout을 다시여시겠습니까?

나는

데몬을 시작할 수 있습니다
freopen("/dev/null/", "r", stdin); 
freopen("log", "w", stdout); 
freopen("log", "w", stderr); 

BOOST_LOG_TRIVIAL(info) << "daemonized!"; 

(정확히 말하면, 그것은 실패하고 종료하지 않습니다), 포크 (fork) 이후에 이런 식으로 뭔가를 시도하고 로그 파일이 생성 될 수있다. 그러나 로그는 비어 있습니다 ("daemonized!"). 이것이 대몬 비난의 올바른 방법이 아닌가? 누군가가 좀 밝힐 수 있을까요?

+0

나는 당신이 앞에있는 이유를 가지고 있다고 생각한다. 만약 당신의'stdout'과/또는'stderr'가 터미널로 가고 있다면, 그것은 당신의 제어 터미널로 남아 있고 그것으로부터 분리하지 못한다. 내가 잘못? –

답변

0

라이브러리 기능 daemon(int nochdir, int noclose)/dev/null에 연결된 표준 I/O 스트림을 적절히 데몬 화하고 추가로 다시 코딩하는 데 도움이됩니다. 그것과 시스템 로그 기능 (예 : syslog)을 사용하면 내가 데몬 비팅하는 "올바른"방법으로 갈 수 있습니다.

표준 I/O 스트림을 열고 /dev/null과 연결하면 남은 I/O로 인한 딸꾹질을 피할 수 있습니다 (예 : 프로세스 차단 또는 예상치 못한 신호 발생). 추가적으로 새로운 디스크립터가 무의식적으로 디스크를 획득하는 것을 막을 수 있고, 출력이 printf 문으로 남게되는 것을 막을 수 있습니다.

은 지금까지 표준 I를 연결하는 등/O가 일반 파일과 스트림, 온라인 daemonize program 사람 페이지에서 다음과 같은 경고는 인식 유용 할 것 같습니다 : 당신은 출력을 리디렉션 곳

하는 것은 조심! 열린 파일이 들어있는 파일 시스템은 파일이 열려있는 한 마운트 해제 할 수 없습니다. 최상의 결과를 얻으려면이 출력 파일이 데몬의 작업 디렉토리와 동일한 파일 시스템에 있는지 확인하십시오.