systemd가 일관되게 표준 출력을 캡처하고 기록하지 않습니다.

systemd가 일관되게 표준 출력을 캡처하고 기록하지 않습니다.

나는 systemd 서비스에 의해 관리되는 최소한의 스크립트를 가지고 있습니다 oneshot. 때때로 이 스크립트에 의해 반향된 표준 출력이 systemd 로그에 나타납니다. 때로는 그렇지 않습니다. 무작위로 나타날 확률은 약 50%입니다.

시스템 서비스:

> cat ~/.config/systemd/user/simple.service
[Unit]
Description=Simple service

[Service]
ExecStart=/bin/sh -c "/home/miles/temp/simple.sh"
Type=oneshot
RemainAfterExit=1

내부 스크립트:

> cat /home/miles/temp/simple.sh
#!/usr/bin/env bash

echo Starting simple
echo exiting
exit 0

다음 명령을 사용하여 서비스를 다시 시작했습니다.

> systemctl --user restart simple.service

때때로 예상되는 스크립트 출력이 나타납니다.

> systemctl status --user simple.service
● simple.service - Simple service
     Loaded: loaded (/home/miles/.config/systemd/user/simple.service; static)
     Active: active (exited) since Thu 2023-11-16 19:54:59 PST; 1min 57s ago
    Process: 3617756 ExecStart=/bin/sh -c /home/miles/temp/simple.sh (code=exited, status=0/SUCCESS)
   Main PID: 3617756 (code=exited, status=0/SUCCESS)
        CPU: 4ms

Nov 16 19:54:59 miles-desk systemd[3064]: Starting Simple service...
Nov 16 19:54:59 miles-desk sh[3617757]: Starting simple
Nov 16 19:54:59 miles-desk sh[3617757]: exiting
Nov 16 19:54:59 miles-desk systemd[3064]: Finished Simple service.

때때로 재부팅하면 스크립트 출력이 손실됩니다.

> systemctl status --user simple.service
● simple.service - Simple service
     Loaded: loaded (/home/miles/.config/systemd/user/simple.service; static)
     Active: active (exited) since Thu 2023-11-16 19:58:57 PST; 29s ago
    Process: 3621103 ExecStart=/bin/sh -c /home/miles/temp/simple.sh (code=exited, status=0/SUCCESS)
   Main PID: 3621103 (code=exited, status=0/SUCCESS)
        CPU: 4ms

Nov 16 19:58:57 miles-desk systemd[3064]: Starting Simple service...
Nov 16 19:58:57 miles-desk systemd[3064]: Finished Simple service.

그러나 몇 번 재부팅한 후에는 다음과 같은 출력이 다시 표시됩니다.

● simple.service - Simple service
     Loaded: loaded (/home/miles/.config/systemd/user/simple.service; static)
     Active: active (exited) since Thu 2023-11-16 20:01:53 PST; 6s ago
    Process: 3622119 ExecStart=/bin/sh -c /home/miles/temp/simple.sh (code=exited, status=0/SUCCESS)
   Main PID: 3622119 (code=exited, status=0/SUCCESS)
        CPU: 4ms

Nov 16 20:01:53 miles-desk systemd[3064]: Starting Simple service...
Nov 16 20:01:53 miles-desk sh[3622120]: Starting simple
Nov 16 20:01:53 miles-desk sh[3622120]: exiting
Nov 16 20:01:53 miles-desk systemd[3064]: Finished Simple service.

출력이 나타나는지 여부는 완전히 무작위로 나타납니다. 플러시 문제가 있을 수 있지만 서비스가 완료된 후 systemd에서 모든 출력을 플러시하고 싶습니다.

버전 정보:

> systemd --version
systemd 249 (249.11-0ubuntu3.11)
+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY -P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified

> uname -a
Linux miles-desk 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct  9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

답변1

기록에서 경쟁 조건에 부딪힌 것 같습니다.SCM_CREDS #2913과의 /proc 경주로 인해 Journald는 종료된 프로세스에서 들어오는 메시지를 해당 cgroup에 귀속시킬 수 없습니다.:

Journalctl --user-unit=... 사용자 작업이 종료되기 직전에 발생하는 로그 줄을 제거하는 것 같습니다.

Lennart Poettering이 댓글을 달았습니다.FreeDesktop.org 오류:

이것은 게임이다. 우리는 SCM_CREDENTIALS를 사용하여 클라이언트 PID를 가져온 다음 /proc에서 _CMDLINE/_COMM/_EXEC 및 cgroupd ata를 빠르게 읽으려고 시도하지만 이 시점에서 프로세스가 중단되었을 수 있습니다.

이 문제를 제대로 해결하려면 cmdline/comm/exe 프로세스를 가져오는 SCM_COMM 정도가 필요하고, 경합 없는 방식으로 cgroup 데이터를 가져오는 SCM_CGROUPS가 필요합니다. 커널에 추가될 때까지 활성 상태로 유지됩니다. 이러한 항목은 배관공의 희망 목록에 있습니다. 왜냐하면 이를 제공할 커널 담당자가 필요하기 때문입니다.

내가 찾은 해결 방법Yevgeny Vereshchagin의 답변예전에는 :

[Unit]
Description=Simple service

[Service]
SyslogIdentifier=simple-service
ExecStart=/home/miles/temp/simple.sh
Type=oneshot
RemainAfterExit=1

...중요한 변경 사항이 추가되었지만 라인 SyslogIdentifier=simple-service도 단순화되었습니다 /bin/sh -c "/home/miles/temp/simple.sh". 다른 쉘을 호출할 필요가 없습니다 /bin/sh. simple.sh가 실행 가능한지 확인하세요. 이미 유용한 sh-bang 라인이 있습니다.

출력은 실제로 이전에 로그에 있었지만 장치와는 아무런 관련이 없습니다. 단지 shsyslog에서 나오는 것으로 표시되었을 뿐입니다.

Nov 17 11:58:00 workstation sh[409442]: Starting simple
Nov 17 11:58:00 workstation sh[409442]: exiting

SyslogIdentifier출력이 다음과 같으므로 사용하는 것이 해결 방법입니다.아직유닛과 관련이 없지만 일기에서 더 쉽게 찾을 수 있습니다.

$ journalctl --user SYSLOG_IDENTIFIER=simple-service
-- Logs begin at Fri 2023-06-09 08:11:26 EDT, end at Fri 2023-11-17 12:16:10 EST. --
Nov 17 12:16:10 workstation simple-service[409845]: Starting simple
Nov 17 12:16:10 workstation simple-service[409845]: exiting

관련 정보