(159)【RaspPi】デーモンを作る。

投稿者: | 2024年10月26日

105 views

【1】やりたいこと

既存のプログラムに以下の動作をさせたい。
・ラズパイの電源ON時に起動
・バックグラウンドで常駐

【2】やってみる

(1) サービスファイルを作成

systemd は rootユーザーが実行するプログラムで、システムの起動プロセスを管理したり、サービスやデーモンの実行、ログ管理などを行う。
サービスとして登録したプログラムは、systemdにより起動される。

この動作をさせるためには、systemdのサービスファイルを作成し、プログラムを自動的に起動するよう設定する。
サービスファイルは/etc/systemd/system/ ディレクトリに配置すえる。

たとえば、以下のコマンドで新しいサービスファイルを作成する。

sudo vi /etc/systemd/system/myprogram.service

サービスファイルの中身には、以下の情報を書く。
★注意★ コメントを書くと起動時にエラーになるので、実際に書く際にはコメントを除去すること。

[Unit]
Description=My Original Program         # サービスの説明
After=network.target                    # ネットワークが起動した後に開始する。

[Service]
ExecStart=/home/hoge/my_program.sh      # プログラムのフルパスを指定
WorkingDirectory=/home/hoge/test        # 任意の作業ディレクトリ
User=hoge                               # 実行するユーザー(必要に応じて変更)
Restart=on-failure                      # プログラムがクラッシュした場合に再起動(正常終了時も再起動したいならalways)
RestartSec=5                            # クラッシュ後に5秒待ってから再起動
KillSignal=SIGTERM                      # プログラム終了時に送信されるシグナル
StandardOutput=journal                  # 標準出力をjournalctlで確認できるように設定
StandardError=journal                   # 標準エラー出力もjournalctlで確認できるように設定

[Install]
WantedBy=multi-user.target              # 一般ユーザーがログイン可能な状態になったら開始する。

※After, WantedByのどちらか遅い方のタイミングでプログラムが開始される。

(2) サービスの有効化と起動

サービスファイルを作成したら、以下のコマンドでサービスを有効化・起動する。

# 新規スタートの場合
sudo systemctl daemon-reload               # サービスの情報を更新する。
sudo systemctl enable myprogram.service    # システム起動時に自動実行させる。
sudo systemctl start  myprogram.service
sudo systemctl status myprogram.service
# リスタートの場合
sudo systemctl daemon-reload
sudo systemctl restart  myprogram.service
sudo systemctl status   myprogram.service

(3) ログの参照

実行時の出力情報は journalctl のログで確認できる。

sudo journalctl -u myprogram.service

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です