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ラインがあります。

出力は実際には以前ログにありましたが、デバイスとは何の関係もありません。sh私はsyslogから出てくるとマークされているだけです。

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

関連情報