시스템 서비스 로그를 로그에 추가하는 방법

시스템 서비스 로그를 로그에 추가하는 방법

내 워크스테이션에서 지속적으로 실행되는 라이센스 서버를 제어하기 위해 systemd를 사용하려고 합니다. 서비스 자체는 기본적으로 쉘 스크립트에 의해 시작됩니다.

Usage: ./rlm_control.sh {start|stop|restart|status}

이것으로부터 나는 시스템 서비스 파일을 만들었습니다.

[Unit]
Description=RLM License Server
After=network.target

[Service]
Type=forking
ExecStart=/path/to/rlm_control.sh start
ExecStop=/path/to/rlm_control.sh stop
ExecReload=/path/to/rlm_control.sh restart
User=chris
Restart=on-failure

[Install]
WantedBy=multi-user.target

문제는 이 제어 스크립트가 실제로 다른 프로세스를 분기하고 자체 로그를 가지고 있다는 것입니다 rlm. 로그는 rlm_control.sh저널드에서 찾을 수 있지만 로그를 rlm찾을 수 없습니다.

tail -f /path/to/rlm.log기본적으로 해당 서비스의 로그에 출력을 추가하도록 저널드에 지시하는 것이 가능합니까 ?

편집: 이 질문은 이전에 [0]에서 요청되었지만 해당 솔루션은 다른 로그 파일에서 읽도록 서비스 파일을 조정하는 대신 명령을 사용하여 로그를 추가하는 것을 제안하는 것 같습니다.

[0]파일에서 로그로 로그 전달

답변1

여기서 문제는 주석에서 이미 말한 내용입니다. 시스템 단위를 만드는 것이 아니라 "시스템 프로세스 생성기"를 만드는 것입니다. 파일을 로그에 연결하는 것이 아니라 서비스를 완벽하게 제공하는 것에 대해 이야기하고 있으므로 소프트웨어 로그를 저널에 보내기 전에 해결해야 할 몇 가지 문제가 있습니다.

  • 실제 시스템 장치에는 비슷한 것이 있어야 하며 데몬을 시작한 상위 프로세스를 호출 하고 종료 ExecStart=/path/to/license_software_bin -d parameter1 -f parameter2 -c -whatever하는 스크립트를 호출하지 않아야 합니다.Type=forkingfork()
  • 구성을 통해 PIDFile=/run/path/to/pidfile.pid프로세스 식별이 향상됩니다. 인용하다systemd.service맨페이지:

PIDFile=

서비스 PID 파일의 경로를 사용합니다. Type=로 설정된 서비스 에 대해 이 옵션을 사용하는 것이 좋습니다 forking. 지정된 경로는 일반적으로 아래 파일 중 하나를 가리킵니다 /run/. 상대 경로를 지정하는 경우 접두사로 를 붙여야 합니다 /run/. PID서비스가 시작된 후 서비스 관리자는 이 파일에서 서비스 기본 프로세스를 읽습니다. 서비스 관리자는 여기에 구성된 파일에 쓰지 않지만 서비스가 종료된 후에도 파일이 남아 있으면 삭제합니다. PID 파일은 권한이 있는 사용자가 소유할 필요는 없지만 권한이 없는 사용자가 소유한 경우 추가 보안 제한 사항을 구현해야 합니다. 파일은 소유한 파일에 대한 심볼릭 링크(직접 또는 간접적으로)가 될 수 없습니다. 다른 사용자의 PID 파일과 이미 해당 서비스에 속한 프로세스를 참조해야 합니다.

그리고:

로 설정하면 forking구성된 프로세스가 시작의 일부로 호출될 ExecStart=것으로 예상됩니다. fork()시작이 완료되고 모든 통신 채널이 설정되면 상위 프로세스가 종료될 것으로 예상됩니다. 하위 프로세스는 계속해서 기본 서비스 프로세스로 실행되며, 상위 프로세스가 종료되면 서비스 관리자는 해당 유닛이 시작된 것으로 간주합니다. 이는 기존 UNIX 서비스의 동작입니다. 이 설정을 사용하는 경우 PIDFile=systemd가 서비스의 기본 프로세스를 안정적으로 식별할 수 있도록 이 옵션도 사용하는 것이 좋습니다 . 상위 프로세스가 종료되면 systemd는 계속해서 후속 유닛을 시작합니다.

httpd.serviceCentOS 7의 시스템 장치 디자인의 단순성을 살펴보십시오 . 바이너리를 직접 호출하므로 프로세스를 종료하고 중지할 시간을 주고 Apache 자체에 특정한 것을 사용하여 다시 로드할 ExecStart=필요가 없습니다 .PIDFile=SIGCONTTimeoutStopSechttpd -k graceful

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

관련 정보