python应用程序配置为在raspberry pi上作为system.d服务运行。服务可以手动启动,但在引导期间不会启动

python应用程序配置为在raspberry pi上作为system.d服务运行。服务可以手动启动,但在引导期间不会启动,python,linux,raspberry-pi,systemd,Python,Linux,Raspberry Pi,Systemd,我已经编写了一个python flask应用程序,它在raspberri pi上启动本地Web服务器。 然后,我通过位于/etc/init.d中的system.d脚本将应用程序配置为在启动时作为服务启动 -rwxr-xr-x 1根目录2359 Dez 17 18:17 VolumioEmilClient 我通过sudo update rc.d VolumioEmilClient defaults启用了该服务 之后我重新启动pi,但服务不会自动启动 尝试在控制台上手动启动服务时,请执行以下操作:

我已经编写了一个python flask应用程序,它在raspberri pi上启动本地Web服务器。 然后,我通过位于/etc/init.d中的system.d脚本将应用程序配置为在启动时作为服务启动

-rwxr-xr-x 1根目录2359 Dez 17 18:17 VolumioEmilClient

我通过
sudo update rc.d VolumioEmilClient defaults启用了该服务
之后我重新启动pi,但服务不会自动启动

尝试在控制台上手动启动服务时,请执行以下操作:
sudo systemctl启动卷客户端
或者通过
/etc/init.d/MyService start

该服务(和python应用程序)启动良好并运行良好

通过
sudo systemctl stop VolumioEmilClient手动停止服务时
奇怪的是,python应用程序一直在运行(通过ps-aux检查并访问url)

这是我的服务文件:

#!/bin/sh
### BEGIN INIT INFO
# Provides: VolumioEmilClient
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start Volumio Emil Client  at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

dir="/home/pi/volumio/python_src"
cmd="python app.py"
user="pi"

name=`basename $0`
pid_file="/var/run/$name.pid"
stdout_log="/home/pi/volumio/logs/$name.log"
stderr_log="/home/pi/volumio/logs/$name.err"

get_pid() {
    cat "$pid_file"
}

is_running() {
    [ -f "$pid_file" ] && ps -p `get_pid` > /dev/null 2>&1
}
case "$1" in
    start)
    if is_running; then
        echo "Already started"
    else
        echo "Starting $name"
        cd "$dir"
        if [ -z "$user" ]; then
            echo "-z user"
            echo $user
            sudo $cmd >> "$stdout_log" 2>> "$stderr_log" &
        else
            echo "SUDO user"
            sudo -u "$user" $cmd >> "$stdout_log" 2>> "$stderr_log" &
        fi
        echo $! > "$pid_file"
        if ! is_running; then
            echo "Unable to start, see $stdout_log and $stderr_log"
            exit 1
        fi
    fi
    ;;
    stop)
   if is_running; then
        echo -n "Stopping $name.."
        kill `get_pid`
        for i in 1 2 3 4 5 6 7 8 9 10
        # for i in `seq 10`
        do
            if ! is_running; then
                break
            fi

            echo -n "."
            sleep 1
        done
        echo
        if is_running; then
            echo "Not stopped; may still be shutting down or shutdown may have failed"
            exit 1
        else
            echo "Stopped"
            if [ -f "$pid_file" ]; then
                rm "$pid_file"
            fi
        fi
    else
        echo "Not running"
    fi
    ;;
       restart)
    $0 stop
    if is_running; then
        echo "Unable to stop, will not attempt to start"
        exit 1
    fi
    $0 start
    ;;
    status)
    if is_running; then
        echo "Running"
    else
        echo "Stopped"
        exit 1
    fi
    ;;
    *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

exit 0

引导后,当通过检查状态时,我得到以下输出
sudo systemctl status VolumioEmilClient

VolumioEmilClient.service - LSB: Start Volumio Emil Client  at boot time
   Loaded: loaded (/etc/init.d/VolumioEmilClient; generated; vendor preset: enabled)
   Active: active (exited) since Tue 2019-12-17 18:49:02 CET; 45s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 365 ExecStart=/etc/init.d/VolumioEmilClient start (code=exited, status=0/SUCCESS)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/VolumioEmilClient.service

Dez 17 18:49:02 emil systemd[1]: Starting LSB: Start Volumio Emil Client  at boot time...
Dez 17 18:49:02 emil VolumioEmilClient[365]: Starting VolumioEmilClient
Dez 17 18:49:02 emil VolumioEmilClient[365]: SUDO user
Dez 17 18:49:02 emil systemd[1]: Started LSB: Start Volumio Emil Client  at boot time.
Dez 17 18:49:02 emil sudo[374]:     root : TTY=unknown ; PWD=/home/pi/volumio/python_src ; USER=pi ; COMMAND=/usr/bin/python app.py
Dez 17 18:49:02 emil sudo[374]: pam_unix(sudo:session): session opened for user pi by (uid=0)
Dez 17 18:49:13 emil sudo[374]: pam_unix(sudo:session): session closed for user pi
什么时候,然后跑步 'sudo systemctl启动卷客户端' 我得到:


在这里,我可以看到python应用程序已经启动。为什么不在启动时使用?

是否需要启动时不可用的资源,例如特定的网络服务或(gasp)GUI?根据我的经验,默认情况下,Python脚本不会从启动系统脚本(此处为
VolumioEmilClient
)分离。因此,一旦systemd父级结束,Python脚本就会消失。一种解决方案是使用一个
守护进程
包装器,该包装器从systemd脚本分离并启动Python脚本。@tripleee最初不需要网络服务-只有在我访问在端口8080上运行的flask应用程序之后才需要。@stovfl:为什么systemd父级会结束?在哪里可以找到创建守护程序包装的方法?“为什么systemd父级结束?”:抱歉,应该在systemd脚本
VolumioEmilClient
结束时阅读。我使用
openvt
运行I,但这需要使用
分离脚本。阅读
● VolumioEmilClient.service - LSB: Start Volumio Emil Client  at boot time
   Loaded: loaded (/etc/init.d/VolumioEmilClient; generated; vendor preset: enabled)
   Active: active (running) since Tue 2019-12-17 18:52:02 CET; 2s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1042 ExecStop=/etc/init.d/VolumioEmilClient stop (code=exited, status=0/SUCCESS)
  Process: 1058 ExecStart=/etc/init.d/VolumioEmilClient start (code=exited, status=0/SUCCESS)
    Tasks: 2 (limit: 4915)
   CGroup: /system.slice/VolumioEmilClient.service
           ├─1063 sudo -u pi python app.py
           └─1070 python app.py

Dez 17 18:52:02 emil systemd[1]: Starting LSB: Start Volumio Emil Client  at boot time...
Dez 17 18:52:02 emil VolumioEmilClient[1058]: Starting VolumioEmilClient
Dez 17 18:52:02 emil VolumioEmilClient[1058]: SUDO user
Dez 17 18:52:02 emil sudo[1063]:     root : TTY=unknown ; PWD=/home/pi/volumio/python_src ; USER=pi ; COMMAND=/usr/bin/python app.py
Dez 17 18:52:02 emil sudo[1063]: pam_unix(sudo:session): session opened for user pi by (uid=0)
Dez 17 18:52:02 emil systemd[1]: Started LSB: Start Volumio Emil Client  at boot time.