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