使用init.d方法

时间:2016-04-25 05:14:39

标签: python linux bash daemon startup

我的环境是嵌入式手臂显示器上的Debian Jesse。

我使用bash脚本使用init.d方法自动启动我的应用程序。它启动第二个python脚本作为守护进程,在启动和重启时处理我的应用程序。

因为它是以我所知的方式运行的,所以这现在是一个守护进程后台进程,它将STDOUT和STDIN与我的python脚本断开连接。

系统和应用程序仅用于一个目的,因此使用后台进程的输出向控制台发送垃圾邮件不仅不是问题,而且是理想的。通过输出,我可以轻松地将ssh或串行控制台插入显示屏,并查看所有实时调试输出或异常。

我已经研究了将进程强制到前台的可能方法,或者将输出重定向到STDOUT但是在启动时运行脚本时没有找到任何明确的答案。

我对文件的记录工作正常,否则应用程序在其所处的状态下运行良好。目前,当我需要调试时,我停止应用程序并手动运行以获取所有输出。

我已经考虑过使用套接字来重定向应用程序的输出,然后运行一个正在监听的单独脚本将打印到控制台......但这似乎不太理想,可能存在更好的解决方案。

是否有方法可以实现这一点,或者我应该接受这个。

编辑1(其他详细信息)

因为我正在为多个进程使用多个日志,所以我创建了一个记录器类。流处理程序使用默认值,该值应为sys.stderr。

import logging
import logging.handlers

class LoggerSetup(object):

    def __init__(self, logName, logFileNameAndPath, logSizeBytes, logFileCount):

        log = logging.getLogger(logName)
        log.setLevel(logging.INFO)

        formatter = logging.Formatter('%(asctime)s - %(levelname)s - ' + logName + ' - %(message)s',datefmt="%m-%d %H:%M:%S")
        # Add the log message handler to the logger

        if(logFileCount > 0):

            fileHandler = logging.handlers.RotatingFileHandler(logFileNameAndPath, maxBytes=logSizeBytes, backupCount=logFileCount)
            log.addHandler(fileHandler)
            fileHandler.setFormatter(formatter)

        consoleHandler = logging.StreamHandler()
        log.addHandler(consoleHandler)
        consoleHandler.setFormatter(formatter)

        log.info(logName + ' initialized')

有关此处的更多参考,请在启动时启动启动脚本。然后它运行我的python run.py,它处理启动过程的其余部分。

#!/bin/sh

### BEGIN INIT INFO
# Provides:          ArcimotoStart
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Startup script
# Description:       startip script that points to run.py
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DAEMON=/app/run.py
DAEMON_NAME=app

# 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 certain features in 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

0 个答案:

没有答案