概要
自作のスクリプトをRaspbian上のsystemdの管理下に置いて、デーモンとして使う方法です。
起動スクリプトの準備
自作のスクリプトを呼び出す起動スクリプトを作成します。 ここでは「/home/pi/myservice」というディレクトリに、「daemon.sh」と言う名前のスクリプトを作ります。 そこから、同じディレクトリにある自作のスクリプト「main.py」を呼び出すこととします。
$ cd /home/pi/myservice $ touch daemon.sh $ chmod 755 daemon.sh
- daemon.sh ここでは、main.pyの標準出力とエラー出力は、myservice.logにリダイレクトして書き出すようにしています。 出力を省略すると、journaldの方に出力されます。必要に応じて選択します。
#!/bin/bash SCRIPTDIR=/home/pi/myservice LOGDIR=$SCRIPTDIR/log exec /usr/bin/env /usr/bin/python3 $SCRIPTDIR/main.py >> $LOGDIR/myservice.log 2>&1
systemdの*.serviceファイルの作成
systemdの管理下に入れるための、個別の設定ファイルを作ります。 「/home/pi/myservice」フォルダのなかに、「myservice.service」を作成します。
$ touch myservice.service
「myservice.service」の内容
[Unit] Description=This is My Service After=local-fs.target ConditionPathExists=/home/pi/myservice [Service] ExecStart=/home/pi/myservice/daemon.sh ExecStop=/bin/kill ${MAINPID} Restart=on-failure StartLimitInterval=60 StartLimitBurst=3 KillMode=mixed Type=simple User=pi Group=pi [Install] WantedBy=multi-user.target
項目 | 設定内容 |
---|---|
Description | このデーモンの概要を説明する文章 |
After=local-fs.target | ファイルシステムが有効になってから起動 |
ConditionPathExists=/home/pi/myservice | このフォルダが有れば起動する |
ExecStart=/home/pi/myservice/daemon.sh | 起動の対象となる実行ファイル |
ExecStop=/bin/kill ${MAINPID} | 停止時に発行するコマンド |
Restart=on-failure | 0以外の終了コードで停止したら再起動 |
StartLimitInterval=60 , StartLimitBurst=3 | StartLimitIntervalの時間の間にStartLimiBurst回以上の再起動があったら、次のStartLimitIntervalの時間の間は再起動を取りやめ |
KillMode=mixed | メインプロセスはSIGTERM/SIGKILLで停止。続けてグループ内の全ての残プロセスをSIGKILLで停止 |
Type=simple | 起動の対象となる実行ファイルが実行したらすぐに起動完了みなす。(フォアグラウンドで実行を継続するスクリプト) |
User=pi , Group=pi | ユーザ/グループ pi として実行する |
WantedBy=multi-user.target | 起動設定するランレベルの指定:コンソールログインマルチユーザモード |
systemdのフォルダに、.serviceファイルを置く。
シンボリックリンクでOK。
$ sudo ln -s $PWD/myservice.service /etc/systemd/system
設定の再読込
$ sudo systemctl daemon-reload
設定の確認
$ sudo systemctl list-unit-files --type=service UNIT FILE STATE alsa-restore.service static ...(省略) myservice.service linked ...(省略) $ sudo systemctl status myservice.service ● myservice.service - This is My Service Loaded: loaded (/home/pi/myservice/myservice.service; linked; vendor preset: enabled) Active: inactive (dead)
有効化する
$ sudo systemctl enable myservice.service
Created symlink /etc/systemd/system/multi-user.target.wants/myservice.service → /home/pi/myservice/myservice.service.
起動する
$ sudo systemctl start myservice.service $ sudo systemctl status myservice.service ● myservice.service - This is My Service Loaded: loaded (/home/pi/myservice/myservice.service; linked; vendor preset: enabled) Active: active (running) since Mon 2019-01-07 13:48:35 JST; 2s ago Main PID: 9487 (python3) CGroup: /system.slice/myservice.service mq9487 /usr/bin/python3 /home/pi/myservice/main.py Jan 07 13:48:35 raspibp systemd[1]: Started This is My Service.
停止する
$ sudo systemctl stop myservice.service $ sudo systemctl status myservice.service ● myservice.service - This is My Service Loaded: loaded (/home/pi/myservice/myservice.service; linked; vendor preset: enabled) Active: inactive (dead) Jan 07 13:48:35 raspibp systemd[1]: Started This is My Service. Jan 07 13:56:45 raspibp systemd[1]: Stopping This is My Service... Jan 07 13:56:45 raspibp systemd[1]: Stopped This is My Service.
無効化する
$ sudo systemctl disable myservice.service Removed /etc/systemd/system/myservice.service. Removed /etc/systemd/system/multi-user.target.wants/myservice.service. $