내 C 프로그램의 모든 출력이 stdout으로 전달되고 Journald로 전송되는 이유는 무엇입니까?

내 C 프로그램의 모든 출력이 stdout으로 전달되고 Journald로 전송되는 이유는 무엇입니까?

저는 yocto 기반 Linux 배포판을 작업하고 있습니다. 나는 이것에 대한 전문가도 아니고 systemd, 나도 아니다 systemd-journald.
내 C 프로그램은 my_c_program시작 시 스크립트에 의해 시작됩니다 my_script.sh. 파일은 다음과 같습니다 my_script.sh.

my_c_program &
echo $! > /dev/shm/my_c_program.pid

이전 스크립트는 서비스에 의해 시작됩니다. 서비스의 단위 파일은 start_c_program.service다음과 같습니다.

[Unit]
Description=Start my_c_program
Requires=...
After=...
Before=...

[Service]
Type=forking
ExecStart=/usr/bin/my_script.sh
PIDFile=/dev/shm/my_c_program.pid

[Install]
WantedBy=multi-user.target

이 구성을 사용하면 모든 지시어 printf("message")가 . 다음과 같이 수정하면 알 수 있습니다 .my_c_program"message"systemd-journaldmy_script.sh

my_c_program > /dev/null &
echo $! > /dev/shm/my_c_program.pid

의 메시지는 journald표시되지 않지만 문제는
왜 내 C 프로그램의 모든 출력이 stdout으로 보내지는 걸까요 journald?

감사해요


예를 들어 다음과 같은 코드를 사용하여 journaldC 명령어를 사용해야 한다는 메시지를 보내려고 합니다 .syslog()

#include<syslog.h>
int main(int argc, char** argv) {
    syslog(LOG_INFO, "Start logging");
}

답변1

Systemd는 실행 프로세스의 표준 출력을 로그에 연결합니다. 표준 출력은 모든 하위 프로세스에서도 상속되므로 C 프로그램이 콘텐츠를 로그에 인쇄합니다. 당신은 그것을 사용할 수 있습니다표준출력=인수는 프로그램의 표준 출력을 다른 위치로 리디렉션합니다.

답변2

이것은 systemd의 디자인 기능이며 실제로 최신 소프트웨어에서 더 일반적입니다.

현대 디자인은 로그를 보낼 위치를 결정하는 소프트웨어에서 실행 중인 프로그램(이 경우 systemd)이 수행할 작업을 결정하도록 하는 방향으로 이동하고 있습니다. 소프트웨어 자체는 stdout 및 stderr에 기록합니다. Docker 또는 Kubernetes에서 실행되는 컨테이너화된 소프트웨어는 매우 유사한 패턴을 가지고 있습니다.

많은 프로그램은 syslog에 쓰는 방법을 모르고, stdout/stderr에 쓰는 것보다 더 복잡합니다. Syslog는 완전히 유비쿼터스된 적이 없으며 이러한 프로그램은 이전에 stdout/stderr을 var 로그의 로그 파일로 리디렉션했을 수 있습니다.

systemd가 프로그램을 시작하면 프로그램을 실행하기 전에 프로세스의 파일 핸들을 교체하여 stdout 및 stderr이 로그로 리디렉션됩니다.

관련 정보