再起動後、システムユーザーサービスは失敗しますが、手動で正しく機能します。

再起動後、システムユーザーサービスは失敗しますが、手動で正しく機能します。
  • 注:~/opt/bin/MemoryDiagnosticsこれはbashスクリプトであり、実行可能です。
$ cat MemoryDiagnostics.service

[Unit]
Description=MemoryDiagnostics Service

[Service]
ExecStart="%h/opt/bin/MemoryDiagnostics"
SyslogIdentifier=MemoryDiagnosticsService

[Install]
WantedBy=default.target
$ systemctl --user enable MemoryDiagnostics.service 
Created symlink /home/nikhil/.config/systemd/user/default.target.wants/MemoryDiagnostics.service → /home/nikhil/.config/systemd/user/MemoryDiagnostics.service. 

その後、再起動してください。観察:再起動後にサービスが失敗します。

$ systemctl --user status MemoryDiagnostics.service 
● MemoryDiagnostics.service - MemoryDiagnostics Service
     Loaded: loaded (/home/nikhil/.config/systemd/user/MemoryDiagnostics.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Thu 2021-09-02 02:34:32 CEST; 11min ago
    Process: 1549 ExecStart=/home/nikhil/opt/bin/MemoryDiagnostics (code=exited, status=1/FAILURE)
   Main PID: 1549 (code=exited, status=1/FAILURE)

Sep 02 02:34:29 X550JX systemd[1147]: Started MemoryDiagnostics Service.
Sep 02 02:34:32 X550JX systemd[1147]: MemoryDiagnostics.service: Main process exited, code=exited, status=1/FAILURE
Sep 02 02:34:32 X550JX systemd[1147]: MemoryDiagnostics.service: Failed with result 'exit-code'.
  • 手動で完了すると、サービスが開始されます。
$ systemctl --user start MemoryDiagnostics.service 
$ systemctl --user status MemoryDiagnostics.service 
● MemoryDiagnostics.service - MemoryDiagnostics Service
     Loaded: loaded (/home/nikhil/.config/systemd/user/MemoryDiagnostics.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2021-09-02 02:48:13 CEST; 4s ago
   Main PID: 9941 (bash)
     CGroup: /user.slice/user-1000.slice/[email protected]/MemoryDiagnostics.service
             ├─9941 bash /home/nikhil/opt/bin/MemoryDiagnostics
             └─9970 sleep 121

Sep 02 02:48:13 X550JX systemd[1147]: Started MemoryDiagnostics Service.

再起動後にシェルスクリプトが失敗しますが、手動で起動すると正しく動作するのはなぜですか?

ベストアンサー1

~/opt/bin/MemoryDiagnostics終了コード1で終了します。これは、エラーがアプリケーション内にあることを意味します。MemoryDiagnostics必要な情報を提供するのに役立つように、より多くの情報がstderrに記録されないことは残念です。しかし、私たちは次のようにいくつかの推測をすることができます。

  • MemoryDiagnosticsGUIを起動したらWantedBy=default.targetに変更しますWantedBy=graphical-session.target
  • MemoryDiagnistics他のリソースへの依存関係がある場合は、セクションにAfter=追加して依存[Unit]関係が準備されていることを確認できます。潜在的に関連するいくつかの依存関係は次のとおりです。
    • After=bluetooth.targetBluetoothも確認中(または確認失敗)の場合。
    • After=default.target追加のサービスが必要な場合default.target
    • このコマンドを実行する前に、別のカスタム単位(インストールやサービスなど)を準備する必要があります。

どの依存関係を準備する必要があるかわからない場合(またはinotifyを使用せずに依存関係を開始するのに時間がかかる場合)、いつでも人為的にExecStartPre=/bin/sleep 55秒の開始遅延を追加できます。

この方法は設定が簡単ですが、不要な遅延時間を追加したり早期に開始したりする危険があります。


この方法が本当に好きなら、ExecStartPre=sleepすぐに実行する必要はなく、頻繁に実行する必要もありません。その後、aを使用して*.timerデバイスを起動することも検討できます。この場合、[Install]サービスからその部分を削除し、次のタイマーを生成します。

# ~/.config/systemd/user/MemoryDiagnostics.timer
[Unit]
Description=MemoryDiagnostics Timer

[Timer]
OnActiveSec=5s

[Install]
WantedBy=default.target

その後、systemctl --user enable MemoryDiagnostics.timerサービスの実行を処理します。

これはExecStart=sleep上記の解決策と実質的に同じですが、以下を追加/変更できる追加機能も提供します。

  • OnCalendar=これにより、スケジュールに従って診断が実行されます。
  • RandomizedDelaySec=これは、同時に多数のサービスがトリガされるのを防ぐために、サービスの実行にランダムなオフセットを適用します。

おすすめ記事