LoginSignup
1
0

More than 1 year has passed since last update.

systemdを使ってプログラムの自動起動が上手く行かなかった時の備忘録

Last updated at Posted at 2023-05-14

はじめに

Ubuntu22.04(LTS)のサーバーに時雨堂さんのWebRTC SFU Soraを導入して、自動起動させる時に詰まったので備忘録。デーモンを起動する必要のある他のソフトにも応用できると思う。結論から言うと、起動用のshell scriptがあるのならserviceファイルはType=oneshotRemainAfterExit=yesを記載すると良い。

特に以下の記事で上手く行かなかった人の助けになればと思う。

一瞬で終了するプログラムをデーモンとして起動したかった

マシンが起動したときに以下のコマンドが自動で走ることを目指す

/home/$USER/Documents/sora-2022.XX.XX/bin/sora daemon

やり方

今回はsystemdを使って自動起動を実現させるため、まずは以下の2つのファイルを作成していく

ファイル名 概要
/etc/systemd/system/XXXX.service systemdからプログラムを起動するための設定ファイル
/opt/パッケージ名/bin/YYYY.sh systemdからプログラムを起動するプログラムを呼び出すためのシェルスクリプト。パッケージ名は何でも良い

今回は例として、名前は以下のようにする
XXXX.service=>boot_sora.service
パッケージ名=>boot_sora
YYYY.sh=>boot_sora.sh

boot_sora.serviceの作成

cd #ホームディレクトリから作業を開始
sudo vi /etc/systemd/system/boot_sora.service

boot_sora.serviceの中身

[Unit]
Description=Auto Start Up Service for Sora #説明文なので好きにに入れる
After=local-fs.target
ConditionPathExists=/opt/boot_sora/bin #自動起動するプログラムが配置されているディレクトリ

[Service]
Type=oneshot #スクリプトでデーモンを一回起動すればそれで済むのでoneshot
RemainAfterExit=yes #本命はExecStartを経て動き出すから
ExecStart=/opt/boot_sora/bin/boot_sora.sh #自動起動するプログラムへのフルパス
Restart=on-failure #プログラムが異常終了した時のみ再起動

[Install]
WantedBy=multi-user.target

ファイル作成後は所有者と権限を設定

sudo chown root:root /etc/systemd/system/boot_sora.service
sudo chmod 644 /etc/systemd/system/boot_sora.service

boot_sora.shの作成

sudo vi /opt/boot_sora/bin/boot_sora.sh

boot_sora.shの中身

#!/bin/sh
/home/$USER/Documents/sora-2022.XX.XX/bin/sora daemon

今回筆者はDocuments配下にソフトを配置していたが、ここのパスは適宜変えること(フルパスが良い)

sudo chmod 755 /opt/boot_sora/bin
sudo chown root:root /opt/boot_sora/bin/boot_sora.sh
sudo chmod 755 /opt/boot_sora/bin/boot_sora.sh

systemctlの更新

作成したserviceファイルをenableするためには、ファイル更新したことをsystemctl側に知らせる必要がある

sudo systemctl daemon-reload #systemctlの更新
sudo systemctl enable boot_sora.service #boot_sora.serviceの自動起動有効化
sudo systemctl status boot_sora.service
# 以下のように .../boot_sora.service; enabled;となっていれば正常に有効化されている
● boot_sora.service - Auto Start Up Service for Sora
   Loaded: loaded (/etc/systemd/system/boot_sora.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

正常にserviceファイルがenableされたら、試運転をする

sudo systemctl start boot_sora.service #手動でserviceを起動
sudo systemctl status RasPiAuto.service #起動後の動作を確認
# こんな出力になるはず
● RasPiAuto.service - A sample automatic execution
   Loaded: loaded (/etc/systemd/system/boot_sora.service; enabled; vendor preset: disabled)
   Active: active (exited) since Tue 2023-05-14 20:47:24 JST; 3min 21s ago

Active: inactive (dead)Active: active (exited)に変わっていれば、作成したスクリプトは正常に動作している。手動でserviceを止める場合はsudo systemctl stop boot_sora.service

補足説明

筆者の場合、Type=simpleにしていた時、デーモンが起動せずに苦慮していた。
そもそも、Type=simpleは、ExecStart で指定したプロセスがメインのサービスプロセスとなり、このプロセスが終了するとサービスも終了するという意味を持つ。そのため/opt/boot_sora/bin/boot_sora.shsora daemon をバックグラウンドで起動してすぐに終了すると、systemdはサービスが終了したと判断される。

一方で、Type=oneshotRemainAfterExit=yes を設定した場合、サービスは ExecStart で指定したプロセスが終了した後も子プロセスを参照して "active" 状態として保持される。したがって、boot_sora.sh スクリプトが sora daemon をバックグラウンドで起動してすぐに終了しても、systemd上ではサービスがまだ稼働しているとみなされる。今回のケースでサービスの稼働状況を監視する場合、後者の方が好ましいだろう。

結局何がいけなかったの?

推測するに、boot_sora.sh スクリプトがsora daemon をバックグラウンドで起動してすぐに終了し、Type=simple の設定下ではその終了がサービスの終了と解釈されたため、サーバーが正常に起動せず、一方で、Type=oneshot の設定下ではスクリプトの終了後もサービスが "active" と見なされ、sora daemon が正常に起動する時間を得られたのかもしれない。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0