Pythonで実装したプログラムを、Raspberry Pi(Raspbian)でデーモン起動させるときのメモ。
python-daemonのインストール
python-daemonは、Pythonプログラムをdaemon化できるパッケージである。
sudo apt-get install python-daemon
デーモンプログラム
Pythonプログラムはこんな感じ。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import serial
import time
from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile
if __name__ == '__main__':
# 以下がデーモンプロセスとして実行される
# pidfileが/tmpにないと、動作しないらしい
with DaemonContext(pidfile=PIDLockFile('/tmp/serial-arduino.pid')):
main()
起動スクリプト
サービス起動させるための起動デーモンは以下の通り。
$ sudo vi /etc/init.d/hoged
#!/bin/sh
### BEGIN INIT INFO
# Provides: hoged
# Required-Start: $local_fs $remote_fs $syslog
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Start hoged daemon
### END INIT INFO
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# Source function library.
. /lib/lsb/init-functions
# Path to the script
DAEMON=/usr/local/sbin/python-hoge.py
PROG=serial-arduino
PIDFILE=/tmp/hoged.pid
LOCKFILE=/tmp/hoged.pid.lock
test -f $DAEMON || exit 0
lock_hoged() {
if [ -x /usr/bin/lockfile-create ]; then
lockfile-create $LOCKFILE
lockfile-touch $LOCKFILE &
LOCKTOUCHPID="$!"
fi
}
unlock_hoged() {
if [ -x /usr/bin/lockfile-create ] ; then
kill $LOCKTOUCHPID
lockfile-remove $LOCKFILE
fi
}
case "$1" in
start)
log_daemon_msg "Starting $PROG server" "$PROG"
lock_hoged
start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON -- -p $PIDFILE
status=$?
unlock_hoged
log_end_msg $status
;;
stop)
log_daemon_msg "Stopping $PROG server" "$PROG"
start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
log_end_msg $?
rm -f $PIDFILE
;;
status)
status_of_proc -p $PIDFILE $DAEMON $PROG
;;
restart)
stop
start
;;
*)
echo "Usage: $PROG {start|stop|status|restart}"
exit 1
;;
esac
最後に変更を反映。
sudo update-rc.d hoged defaults