systemdのサービスとしてpythonスクリプトを実行

systemdのサービスを作るチュートリアルは多々ありますが、説明が少なすぎたり多すぎたりするのが多いのですが丁度良い具合のチュートリアルがありました。

https://www.reddit.com/r/raspberry_pi/comments/4vhofs/creating_a_systemd_daemon_so_you_can_run_a_python/

systemdのサービスを作成するには * unit ファイルの作成 * サービスを実行可能に設定

する必要があります。

systemdユニットファイル

/etc/systemd/systemフォルダに service_name.serviceとファイル名で以下のような内容のファイルを作成します。

[Unit]
Description=My Systemd service
After=multi-user.target

[Service]
Type=simple
ExecStart=/home/pi/my_python.py
User=pi
WorkingDirectory=/home/pi/
Restart=on-failure

[Install]
WantedBy=multi-user.target

Descriptionはサービスの概要です。 is the user-friendly name of the service.

After=multi-user.targetは全てのユーザーがログイン可能になった後で実行する設定です。特に考えず この設定にしておけば問題ないでしょう。

Typeはサービスをどのように実行するかの設定です。他にもいろいろあるようですが普通のスクリプトを実行するだけのサービスならsimpleで良さそうです。一応、リンク。

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#ftn.idp25579584

ExecStartには実行したいスクリプトを指定します。実行権限を付けてスクリプトの一行目にshebangを付けておきましょう。

pi@pizero1:~ $chmod +x my_python.py
#!/usr/bin/python3

Userは指定しないとrootで実行されるので指定しておきましょう。

WorkingDirectoryは実行フォルダを指定します。オプションなので指定しなくても大丈夫です。

Restart=on-failureはエラーでスクリプトが修了した際にリスタートする設定です。

WantedByはブート時にサービスがインストールされ開始可能にする設定です。この設定を使っておけば問題なさそうです。

実行可能に設定

上のユニットファイルを/etc/systemd/system/フォルダに作成したら、後は

pi@pizero1:~ $ sudo systemctl daemon-reload
pi@pizero1:~ $ sudo systemctl enable my_service
pi@pizero1:~ $ sudo systemctl start my_service

で実行されます。enableを設定したのでマシンの起動時に自動的に実行されます。