hotch-potch, Note to self

いろいろ作業記録

systemdに自作スクリプトを登録

概要

自作のスクリプトを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.
$

参考資料