/dev/console
전송된 모든 데이터를 다른 것(예: - to /dev/null
, /dev/tty9
even )으로 동적으로 리디렉션할 수 있습니까 /dev/null
?
확신하는정적으로console=XXX
커널 시작 매개변수(또는 단일 프로그램의 경우 표준 파이프 리디렉션)를 통해 . 문제는 (출력을 수행하는 모든 프로그램에 대해) 외부 장치의 데이터를 기반으로 이 작업을 동적으로 수행해야 한다는 것입니다.
어떤 제안이 있으십니까?
답변1
몇 가지 옵션을 생각해 볼 수 있는데, 그 효과는 "콘솔"에 어떻게 들어가는지에 따라 달라집니다.
커널에서 생성된 메시지의 경우 가장 간단한 접근 방식은 dmesg -n 1
(거의 모든) 콘솔 메시지를 비활성화하고 syslogd/klogd를 사용하여 메시지를 추출 및 기록하거나 전달하는 것입니다. 콘솔 로그 수준에 관계없이 모든 커널 메시지는 계속 기록되며 /proc/kmsg
(또는)을 통해 액세스할 수 있습니다. sys_syslog()
이에 대한 변형은 커널을 부팅하여 출력을 quiet
억제 printk()
하고 syslogd/klogd에만 의존하여 커널 메시지를 처리하는 것입니다.
보다 모험적이고 포괄적인 옵션은 다음을 사용하는 것입니다.콘솔 모듈, 이는 VM 호스트가 게스트 콘솔에 직접 액세스할 수 있도록 VM 게스트와 함께 더 일반적으로 사용됩니다. 가지다두 가지 유형, 이것시스템 드라이버(예: x86 PC의 "VGA", 커널 "console=" 옵션);모듈러 드라이브필요에 따라 로드 및 언로드할 수 있으며 시스템 드라이버를 대신할 수 있습니다. 유용할 수 있는 드라이버 중 하나는 다음과 같습니다.네트워크 콘솔, 로드 및 언로드가 쉽지만(시스템 드라이버와 모듈형 드라이버 모두로 사용할 수 있음) 두 가지 단점이 있습니다.
- 이는 사실이 아니므
take_over_console()
로 모든 것이 여전히 원래 콘솔로 이동됩니다. - 이더넷을 통해서만 녹음합니다(루프백은 지원되지 않음).
"가상" 콘솔과 위의 옵션 중 하나를 사용하여 유용한 작업을 수행할 수 있습니다. netcat
또는 socat
웹 콘솔에 적합한 "클라이언트"를 만드십시오.
modprobe netconsole "[email protected]/eth0,[email protected]/ff:ff:ff:ff:ff:ff"
socat UDP4-LISTEN:55514 -
다양한 시스템 서비스에서 콘솔 출력을 캡처하는 데 더 관심이 있다면 스크립트를 수정하지 않고는 쉬운 방법이 없다고 생각합니다.
이를 수행하는 사소하지 않은(아마도 나쁜) 방법에는 LD_PRELOAD를 사용하여 출력을 생성하는 리디렉션 기능을 가로채 거나 일부 _init
코드를 추가하여 기본 파일 설명자를 수정하는 것이 포함됩니다. 또는 더 나쁜 경우: 디버거를 연결하고열린 파일 설명자 조작. /etc/ld.so.preload
첫 번째 옵션을 구현하는 간단한(해키적이고 다소 성가신 경우) 방법이 될 것입니다.
데몬의 콘솔 출력을 모니터링하려면 시작 스크립트를 수정하여 screen
세션에서 실행할 수도 있습니다.이와 같이.