ラズパイでmyfareアプリを起動時に立ち上げしようと思ってrc.localに記述しても起動しません。実は最近のLinuxのバージョンではrc.localは単にipアドレスの表示をするだけになっていて、アプリの起動はsystemdを使えということのようです。しかしsystemdに設定したつもりでも起動するとエラーになります。実行ファイルと同じディレクトリに配置しているファイルが見つからないと言われます。
$ sudo systemctl status myfare.service
● myfare.service - myfare
Loaded: loaded (/etc/systemd/system/myfare.service; enabled; vendor preset>
Active: failed (Result: exit-code) since Wed 2023-04-19 11:57:00 BST; 9s a>
Process: 1805 ExecStart=/home/pi/myfare/main (code=exited, status=1/FAILURE)
Main PID: 1805 (code=exited, status=1/FAILURE)
CPU: 121ms
Apr 19 11:57:00 rasp-b systemd[1]: Started myfare.
Apr 19 11:57:00 rasp-b main[1805]: open uid.json: no such file or directory
事例検索して行き着いたのが、WorkingDirectory設定。
[Unit]
Description=myfare
[Service]
WorkingDirectory=/home/pi/myfare/
Type=simple
ExecStart=/home/pi/myfare/main
[Install]
WantedBy = multi-user.target
つまりこれを指定しないと、実行ファイルからファイルを見つけられなくなります。
systemdの記述方法はネットにたくさんありますが、ここに行き着くのに一時間以上。大本のマニュアル見た方が早かったかと思いますが、ともかくも以下の一連のコマンドの手順で自動起動できました。
サービスファイルを記述して、daemonのリロード
$ sudo systemctl daemon-reload
起動確認
$ sudo systemctl start myfare.service
正常に起動していることを確認
$ sudo systemctl status myfare.service
起動時にサービスを有効化
$ sudo systemctl enable myfare.service
admin