Help us understand the problem. What is going on with this article?

Pythonスクリプトをサービスで起動させる

More than 5 years have passed since last update.

ほぼ、Getting a Python script to run in the background (as a service) on bootのまま。

pythonスクリプトの作成

たとえば、ここでは/usr/bin/local/test/test.pyをサービスで起動したと仮定する。

Deamon Spcriptの作成

ひな形

下記のスクリプトをmyservice.shとして/usr/local/bin/testに作成する。

myservice.sh
#!/bin/sh

### BEGIN INIT INFO
# Provides:          myservice
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=root

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;
    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0

スクリプトの編集

pythonスクリプトの保存場所に合わせて、下記の内容を編集。

DIR=/usr/local/bin/myservice
DAEMON=$DIR/myservice.py
DAEMON_NAME=myservice

たとえば、/usr/local/bin/test/test.pyをデーモン化させる場合は、次のように編集すればいい。

DIR=/usr/local/bin/test
DAEMON=$DIR/test.py
DAEMON_NAME=test

/etc/init.dへコピー

パーミッションなどを変更後、/etc/init.dへコピーする

cd /usr/local/bin/test
sudo chown root.root myservice.sh
sudo chmod 755 myservice.sh
sudo cp myservice.sh /etc/init.d/

Pythonスクリプトのパーミッション変更

pythonスクリプトも合わせてパーミッションを変更しておく

cd /usr/local/bin/test
sudo chmod 755 test.py

Serviceへの登録

デーモンスクリプトの動作確認

以下のコマンドで、動作確認しておく

sudo /etc/init.d/myservice.sh start
sudo /etc/init.d/myservice.sh status
sudo /etc/init.d/myservice.sh stop

サービスへの登録

以下のコマンドでサービスへ登録する

sudo update-rc.d myservice.sh defaults

サービスに登録できているかどうかは、下記のコマンドで確認できる

ls -l /etc/rc?.d/*myservice.sh
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away