systemd

起動時にros2 launchを実行させます。

環境はUbuntu 22.04 Server for ARMとUbuntu 22.04 Desktopです。

とりあえず動けばいいでやってみる

出来るだけ錯綜している情報は掴まないようには気をつけています。


$ cd /etc/systemd/system
$ sudo vi sample.service
$ sudo chmod 644 sample.service

下記が作成したOSの起動時に起動させるservice。

sample.service

[Unit]
Description=launch sample daemon

[Service]
Type=simple
User=jn
EnvironmentFile=/home/jn/.bashrc.upstart
ExecStart=/bin/bash -c ". /home/jn/.bashrc.upstart; ros2 launch sample sample.launch.py use_sim_time:=${USE_SIM_TIME}"
KillMode=process
Restart=always
RestartSec=42s

[Install]
WantedBy=multi-user.target

上記のservice用に切り出した.bashrcを.bashrc.upstartとします。

~/.bashrc.upstart

. /opt/ros/humble/setup.bash
. /home/jn/ros/sample_ws/install/setup.bash

USE_SIM_TIME=false
export USE_SIM_TIME

説明していきます。

EnvironmentFile=/home/jn/.bashrc.upstart

環境変数を設定する。上記の例のUSE_SIM_TIMEが使えるようになる。

setup.bashを読み込んでいるがros2が見つからないと怒られる。

ExecStart=/bin/bash -c ". /home/jn/.bashrc.upstart; ros2 launch sample sample.launch.py use_sim_time:=${USE_SIM_TIME}"

setup.bashを使いたいのでbash -cを使って.bash.upstartを読み込んでいる

これでros2などを使えるようになる。環境変数は使えるようにならない。

WantedBy=multi-user.target

これがないとsystemctl startでは怒られないがsystemctl enableで怒られる。

[Install]に対する記述が無いのはおかしいということらしい。

登録。


$ cd /etc/systemd/system
$ sudo systemctl enable sample.service

serviceを書き換えたら。


$ systemctl daemon-reload

期待通りの動作をしているか確認。


$ journalctl

まとめ

本当はこんなに汚いはずは無いので機会があれば綺麗にします。





«       »