StandardOutput パスを削除すると、サービスは開始されません。

StandardOutput パスを削除すると、サービスは開始されません。

StandardOutputログの場所にログインするように構成されたサービスがあります。一部のユーザーは、ログデータの収集時にログパスを削除できます。サービスを再起動してもパスが存在しない場合、サービスは失敗します。回避策がありますか?優先順位による解決策は次のとおりです。

[Unit]
Description=Some service

[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:<path_to_logs>/service-stdout.log

[Install]
WantedBy=default.target
  1. StandardOutputを記録するパスを作成します。 StartExecPreと私のサービススクリプト自体を使ってみましたが、成功しませんでした。

ExecStartPre=mkdir -p <path_to_logs>

  1. パスが存在しないことを無視し、何も記録せずに続行します。

  2. デフォルトの場所にログインします。ログで出力を見つけようとしましたが、まったく表示されません。サービスにStandardOutputパラメータが指定されていない場合、実際にはデフォルトで記録されますか?

事前にありがとう

答え1

man systemd.exec説明する:

追加:パスは上記のファイル:パスと似ていますが、ファイルを追加モードで開きます。

file:pathオプション...パスがファイルシステムの通常のファイルを参照している場合は、そのファイルを開きます(またはまだ存在しない場合は作成します)...

したがって、ファイルが存在する必要はありません。しかし、それがあるディレクトリはおそらく存在するはずです。

ログディレクトリが存在するかどうかを確認する方法はいくつかあります。

  1. ソフトウェアがパッケージ化されている場合は、永続ディレクトリを作成してくださいmkdir -p /var/log/...postinstこれにより、永続ディレクトリが作成されます。これは些細なことなので詳しく扱いません。
  2. TMPファイル.d。これにより、ディレクトリが存在することを確認できます。削除された場合(またはtmpfsに存在する場合)、次の起動時に再生成されます。これがsystemdが保証され存在/run/log/journalする/var/log/journal方法です。
  3. LogsDirectory=デバイスの起動時にログディレクトリを作成するために使用できます。
  4. パス単位。起動時にディレクトリを作成して監視できるようにする「myservice.path」というまったく新しい単位を作成できます。ディレクトリが削除されると、デバイスはmkdir -pディレクトリを再生成するために実行されるサービスをトリガーできます。

一時ファイル.d:

あなたが望むなら:

[Service]
StandardOutput=append:/var/log/myservice/log.log

次に、このファイルを作成します。

# /etc/tmpfiles.d/myservice.conf
#Type Path               Mode User Group Age  Argument
d     /var/log/myservice 0755 root root  -    -

この場合、ユーザーはこのディレクトリを読み取ることができますが、削除することはできません(管理者権限なし)。削除した場合は、再systemd-tmpfiles-setup.service起動または再起動で再生成できます。

ログディレクトリ =

man tmpfiles.d説明する:

システムデーモンにはプライベートランタイムディレクトリが必要なことがよくあります。このために tmpfiles.d が提供する柔軟性が不要な場合は、そのユニットファイルで RuntimeDirectory= を使用するのが最善です (詳細は systemd.exec(5) を参照)。利点は、デバイスに必要な構成が1か所にあり、ディレクトリのライフサイクルがサービス自体のライフサイクルに関連付けられていることです。同様に、...、LogsDirectory =、...を使用して... /var/log/...の下にディレクトリを作成する必要があります。 tmpfiles.dは、ライフサイクルがサービスに依存しないか、より複雑なファイルに使用する必要があります。構成。

したがって、以下を使用することをお勧めします。LogsDirectory=

1つの利点は、ユーザーがディレクトリを削除すると、サービスを再起動するたびにディレクトリが自動的に作成されることです。

例は次のとおりです。

[Service]
ExecStart=<some_path>/start_service.sh
Restart=on-failure
StandardOutput=append:/var/log/myservice/service-stdout.log
LogsDirectory=myservice

このディレクトリへのパスは、サービスに環境変数として提供することもできます$LOGS_DIRECTORY

このソリューションの欠点は、ディレクトリが常に.で終わると仮定することです/var/log。一部のサンドボックス構成では、(おそらく.を使用している場合DynamicUser=)、またはこのデバイスがバスに移動したときにそうでない可能性があります--user

答え2

ログ内のログを見つけるには、stdoutをsyslogに設定し、StandaedOutput=syslog次のrsyslogようにサービスを再起動する必要があります。systemctl restart rsyslog

これを参照してください——https://stackoverflow.com/questions/37585758/how-to-redirect-output-of-systemd-service-to-a-file

関連情報