- 注:
~/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に記録されないことは残念です。しかし、私たちは次のようにいくつかの推測をすることができます。
MemoryDiagnostics
GUIを起動したらWantedBy=default.target
に変更しますWantedBy=graphical-session.target
。MemoryDiagnistics
他のリソースへの依存関係がある場合は、セクションにAfter=
追加して依存[Unit]
関係が準備されていることを確認できます。潜在的に関連するいくつかの依存関係は次のとおりです。After=bluetooth.target
Bluetoothも確認中(または確認失敗)の場合。After=default.target
追加のサービスが必要な場合default.target
- このコマンドを実行する前に、別のカスタム単位(インストールやサービスなど)を準備する必要があります。
どの依存関係を準備する必要があるかわからない場合(またはinotifyを使用せずに依存関係を開始するのに時間がかかる場合)、いつでも人為的にExecStartPre=/bin/sleep 5
5秒の開始遅延を追加できます。
この方法は設定が簡単ですが、不要な遅延時間を追加したり早期に開始したりする危険があります。
この方法が本当に好きなら、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=
これは、同時に多数のサービスがトリガされるのを防ぐために、サービスの実行にランダムなオフセットを適用します。