This service is available only in Japanese-language.
yoctoの公式HPや、その他サイトの記述にありますとおり、
yoctoのレシピで、serviceファイルを追加し、自動実行するには、以下を記述するようにとあります。
※ 下記のディレクトリパスは、現在開発中のレシピを抜粋したパスです。
==============================
inherit systemd
SYSTEMD_SERVICE:${PN} += "test.service"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"
do_install() {
install -d ${D}${systemd_system_unitdir}
install -m 0644 ${WORKDIR}/test.service ${D}${systemd_system_unitdir}/
}
==============================
このレシピには、もともと、別のserviceファイル (以降、origin.service) に対する記述が含まれていました。
origin.serviceは、OS起動後に自動でservice起動していることは確認できています。
ですので、このレシピ内の origin.service に対する記述をもとに、
自身で作成したserviceファイル (my.service) を追加して、
my.service も、OS起動後に自動でservice起動させようとしました。
しかし、origin.service は起動し、my.service は以下のログにより起動しません。
==============================
○ my.service - Execute my.sh
Loaded: loaded (/usr/lib/systemd/system/my.service; static)
Active: inactive (dead)
==============================
レシピを何度見返しても、
origin.service に対する記述と、my.service に対する記述は、相違ありません。
あるとすれば、origin.service・my.service の中身くらいですが…
考えられる原因と、それに対する対策について、ご教示いただければ幸いです。
みつきん
2025/7/31 (木) 14:12
serviceファイルの追加について
本件回答します。
==============================
○ my.service - Execute my.sh
Loaded: loaded (/usr/lib/systemd/system/my.service; static)
Active: inactive (dead)
==============================
このログではサービスが「static」となっています。
https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to...
> このコンテキストでのstaticとは、そのユニットファイルにユニットを有効にするinstallセクションがないことを意味します。 そのため、これらのユニットは有効にできません。通常、これは、ユニットが1回限りのアクションを実行するか、別のユニットの依存関係としてのみ使用され、単独で実行されるものではないことを意味します。
おそらくmy.serviceの定義が不十分であると思われます。
当方の手元では以下のユニットファイルで正しく動作しました。(test.serviceとして作成しました)
==============================
[Unit]
Description=Sample service
[Service]
ExecStart=my.sh
Type=simple
[Install]
WantedBy=multi-user.target
==============================
正しく動作した場合は以下の様なログになります。
==============================
root@qemuarm64:~# systemctl status test
* test.service - Sample service
Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; preset: enabled)
Active: inactive (dead) since Thu 2025-07-31 05:10:27 UTC; 10s ago
Duration: 141ms
Process: 201 ExecStart=my.sh (code=exited, status=0/SUCCESS)
Main PID: 201 (code=exited, status=0/SUCCESS)
CPU: 102ms
Jul 31 05:10:27 qemuarm64 systemd[1]: Started Sample service.
Jul 31 05:10:27 qemuarm64 my.sh[201]: Hello
Jul 31 05:10:27 qemuarm64 systemd[1]: test.service: Deactivated successfully.
==============================
[Install]セクションがない場合は当方の環境でも以下のようになりました。
==============================
root@qemuarm64:~# systemctl status test
* test.service - Sample service
Loaded: loaded (/usr/lib/systemd/system/test.service; static)
Active: inactive (dead)
==============================
ご確認ください。
kawabata0820
2025/8/1 (金) 09:13
ありがとうございます。
上記のserviceファイルで、期待する動作となるか確認してみます。
=====
[Unit]
Description=Execute bootup.sh when booting OS
DefaultDependencies=no
After=local-fs.target
[Service]
Type=oneshot
ExecStart=my.sh
RemainAfterExit=true
[Install]
WantedBy=local-fs.target
=====
https://mickey-happygolucky.hatenablog.com/entry/2016/03/18/004926
を参考に、local-fs.target.wants にシンボリックリンクを作るように、レシピ内に追記したことで、無事に自動起動できるようになりました。
*.serviceの定義の違いで、
●シンボリックリンクを張らなくても、SYSTEMD_SERVICE:${PN} に追加するだけで自動で動作する場合
●SYSTEMD_SERVICE:${PN} に追加しても自動で動作しない場合 (シンボリックリンクを張ったら動作する場合)
となります。
みつきんさんの test.service と、当方の my.service とは、定義としてはあまり差異はないように見えるのですが、大きな違いはあるのでしょうか?
みつきん
2025/8/1 (金) 09:25
serviceファイルの追加について
> ●シンボリックリンクを張らなくても、SYSTEMD_SERVICE:${PN} に追加するだけで自動で動作する場合
> ●SYSTEMD_SERVICE:${PN} に追加しても自動で動作しない場合 (シンボリックリンクを張ったら動作する場合)
となります。
>
> みつきんさんの test.service と、当方の my.service とは、定義としてはあまり差異はないように見えるのですが、大きな違いはあるのでしょうか?
ここで言うシンボリックリンクが何を言っているのかわかりませんが、
当方では特にシンボリックリンクの作成などの処理は行っていません。
*.serviceに以下の[Install]のセクションを記述するか否か、サービスの起動に成功するか失敗するかが変わるだけです。
====
[Install]
WantedBy=multi-user.target
====
WantedByの部分はlocal-fs.targetに書き換えても動く気がします。
これはYoctoやレシピの書き方の問題ではなくて
systemdのサービス(ユニットファイル)の仕様の問題です。
[Install]セクションが記述されていないサービスはstaticとなり、単体で起動できないということです。