我的环境是嵌入式手臂显示器上的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