Bashスクリプトを開始するようにサービスユニットを設定します。なぜ失敗したのですか?

Bashスクリプトを開始するようにサービスユニットを設定します。なぜ失敗したのですか?

systemdにプロセスを監視し制御するように依頼しましたが、何らかの理由で失敗します。質問の最後の出力を確認してください。

複数のプロセスを開始するbashスクリプトがあります/usr/sbin/ros_diagnostics.sh。端末でスクリプトを実行すると正常に動作します。

userk@histamine:~$ /usr/sbin/./ros_diagnostics.sh
[INFO] [launch]: All log files can be found below /home/userk/.ros/log/2023-03-09-11-55-58-140994-histamine-4737
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [aggregator_node-1]: process started with pid [4739]
[INFO] [diagnostics_updater-2]: process started with pid [4741]
[aggregator_node-1] [INFO] [1678362958.452807708] [AnalyzerGroup]: Retrieved 7 parameter(s) for analyzer group with prefix ''.
[aggregator_node-1] [INFO] [1678362958.452943046] [AnalyzerGroup]: Group '/Testrig', creating diagnostic_aggregator/AnalyzerGroup 'Create3' (breadcrumb: create3) ...
[aggregator_node-1] [INFO] [1678362958.454561926] [AnalyzerGroup]: Retrieved 5 parameter(s) for analyzer group with prefix 'create3'.
[aggregator_node-1] [INFO] [1678362958.454630094] [AnalyzerGroup]: Group '/Testrig/Create3', creating diagnostic_aggregator/GenericAnalyzer 'Propulsion' (breadcrumb: analyzers.propulsion) ...
[aggregator_node-1] [INFO] [1678362958.454962645] [GenericAnalyzerBase]: Initialized analyzer 'Propulsion' with path '/Testrig/Create3/Propulsion' and breadcrumb 'create3.analyzers.propulsion'.
[aggregator_node-1] [INFO] [1678362958.455007938] [AnalyzerGroup]: Adding analyzer 'Propulsion' to group '/Testrig/Create3'.
[aggregator_node-1] [INFO] [1678362958.455031856] [AnalyzerGroup]: Initialized analyzer group '/Testrig/Create3' with path '/Testrig/Create3' and breadcrumb 'create3'.
[aggregator_node-1] [INFO] [1678362958.455047106] [AnalyzerGroup]: Adding analyzer '/Testrig/Create3' to group '/Testrig'.
[aggregator_node-1] [INFO] [1678362958.455061398] [AnalyzerGroup]: Initialized analyzer group 'Testrig' with path '/Testrig' and breadcrumb ''.
[aggregator_node-1] [INFO] [1678362958.455081024] [GenericAnalyzerBase]: Initialized analyzer 'Other' with path '/Testrig/Other' and breadcrumb ''.

pstree以下は、セッションでスクリプトを手動で起動したときの出力ですtmux

├─tmux: server─┬─bash───pstree
│              ├─bash
│              └─bash───ros_diagnostics───ros2─┬─aggregator_node───10*[{aggregator_node}]
│                                              ├─diagnostics_upd───9*[{diagnostics_upd}]
│                                              └─2*[{ros2}]

起動時にこのスクリプトを実行するようにサービスユニットを設定しようとしています。これはサービス単位ファイルです。

[Unit]
After=network-online.target 

[Service]
Type=simple
User=userk
ExecStart=/usr/sbin/ros_diagnostics.sh

[Install]
WantedBy=multi-user.target

サービスをアクティブにし、デーモンを再ロードし、起動すると終了します。これはの出力ですsudo systemctl status ros_diagnostics.service

userk@histamine:~$ sudo systemctl status ros_diagnostics.service
● ros_diagnostics.service
     Loaded: loaded (/etc/systemd/system/ros_diagnostics.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Thu 2023-03-09 11:37:38 UTC; 9min ago
    Process: 4519 ExecStart=/usr/sbin/ros_diagnostics.sh (code=exited, status=0/SUCCESS)
   Main PID: 4519 (code=exited, status=0/SUCCESS)

Mar 09 11:37:36 histamine systemd[1]: Started ros_diagnostics.service.
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [INFO] [launch]: All log files can be found below /home/userk/.ros/log/2023-03-09-11-37-38-219143-histamine-4577
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [INFO] [launch]: Default logging verbosity is set to INFO
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [INFO] [aggregator_node-1]: process started with pid [4579]
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [INFO] [diagnostics_updater-2]: process started with pid [4581]
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [aggregator_node-1] /opt/ros/foxy/lib/diagnostic_aggregator/aggregator_node: >
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [ERROR] [aggregator_node-1]: process has died [pid 4579, exit code 127, cmd '/opt/ros/foxy/lib/diagnostic_aggregator/aggregator_node --ros-args --params-file /home/userk/development/ros2/galactic_ws/install/robot_diagnostics/share/robot_diagnostics/config/diagnostics.yaml -r /diagnostics:=diagnostics -r /diagnostics_agg:=diagnostics_agg -r /diagnostics_toplevel_state:=diagnostics_toplevel_state'].
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [INFO] [diagnostics_updater-2]: sending signal 'SIGINT' to process[diagnostic>
Mar 09 11:37:38 histamine ros_diagnostics.sh[4577]: [ERROR] [diagnostics_updater-2]: process has died [pid 4581, exit code -2, cmd '/home/userk/development/ros2/galactic_ws/install/robot_diagnostics/lib/robot_diagnostics/diagnostics_updater --ros-args -r /diagnostics:=diagnostics -r /diagnostics_agg:=diagnostics_agg -r /diagnostics_toplevel_state:=diagnostics_toplevel_state'].

Mar 09 11:37:38 histamine systemd[1]: ros_diagnostics.service: Succeeded.

気づく Bashスクリプトの出力が異なります。ここでは、新しいスクリプトの代わりに古い(キャッシュされた?)バージョンのスクリプトが使用されているかどうかはわかりません。このスクリプトの以前のバージョンには欠陥があり、起動に失敗しました。その後、ユニットファイルを生成してスクリプトを修正して問題を解決しました。

デバイスが正しく設定されていませんか?提案はありますか?

関連情報