我必须用Python3开发一个程序,它在特定时间自动执行程序。我必须使用守护进程,我不能使用外部库。
这就是为什么我创建一个配置守护进程的安装程序(我遵循本教程https://openclassrooms.com/courses/faire-un-demon-sous-linux)。
文件gobatch
是自动执行程序的程序。
#! /usr/bin/python3
# -*- coding: utf8 -*-
import os
import sys
import time
import shutil
# Check if script is start with root rights
if os.geteuid() != 0:
exit('You need to have root privileges to run this script. Use \'sudo ./install.py\'.')
# Title
print('----- ProcessManager install ----- \n')
time.sleep(1)
# Get path of gobatch file
gobatchPath = input("Please enter the path (absolute) where the ProcessManager gobatch program is located: ")
# Check if file exists
try:
with open(gobatchPath):
pass
except IOError:
exit('Error : file does not exists.')
# Copy gobatch file into /usr/bin/
shutil.copy(gobatchPath, '/usr/bin/gobatch')
# Create and fill the automatic launch program
description = 'Deamon that allows you to run cyclicaly at a date or a specific time a program'
fileContent = '#### BEGIN INIT INFO \n' \
'# Provides: chillispot et freeradius dans le chroot \n' \
'# Required-Start: $local_fs $network \n' \
'# Required-Stop: $local_fs $remote_fs _\n' \
'# Default-Start: 2 3 4 5 \n' \
'# Default-Stop: 0 1 6 \n' \
'# Short-Description: Wireless & LAN Access Point Controller \n' \
'# Description: ChilliSpot is an open source captive portal \n' \
'# or wireless LAN access point controller. \n' \
'### END INIT INFO \n\n\n' \
'DESC="' + description + '"\n' \
'DEAMON=/usr/bin/gobatch'
file = open('/etc/init.d/gobatch', 'w')
file.write(fileContent)
file.close()
# Give the rights
os.chmod('/etc/init.d/gobatch', 0o755)
# Save gobatch file to be active
os.system('update-rc.d gobatch defaults')
但是,当我使用/etc/init.d/gobatch start
启动服务并使用service gobatch status
显示状态时,我
gobatch.service - SYSV: ChilliSpot is an open source captive portal
Loaded: loaded (/etc/init.d/gobatch; bad; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
你能告诉我,我的方式是正确的方法还是存在其他解决方案?
你知道为什么我的守护进程在启动后会直接死掉吗?
感谢您的帮助!
更新
目前,我的gobatch
文件不是真正的程序,因为我更喜欢先创建deamon。
gobatch文件
#! /bin/bash
echo "it works !"
我的工作是创建守护程序的安装程序,而不是gobatch
程序。这是另一个必须这样做的人。这就是我使用minmial内容的原因。
更新2:
我的新/etc/init.d/gobatch
:
#!/bin/sh
#### BEGIN INIT INFO
# Provides: chillispot et freeradius dans le chroot
# Required-Start: $local_fs $network
# Required-Stop: $local_fs $remote_fs _
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Wireless & LAN Access Point Controller
# Description: ChilliSpot is an open source captive portal
# or wireless LAN access point controller.
### END INIT INFO
PATH=/bin:/usr/bin:/sbin:/usr/sbin
DESC="Deamon that allows you to run cyclicaly at a date or a specific time a program"
NAME=gobatch
DEAMON=/usr/sbin/gobatch
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/"$NAME"
. /lib/lsb/init-functions
case "$1" in
start) log_daemon_msg "Starting gobatch"
start_daemon -p $PIDFILE $DAEMON
log_end_msg $?
;;
stop) log_daemon_msg "Stopping gobatch"
killproc -p $PIDFILE $DAEMON
RETVAL=$?
[ $RETVAL -eq 0 ] && [ -e "$PIDFILE" ] && rm -f $PIDFILE
log_end_msg $RETVAL
;;
restart) log_daemon_msg "Restarting gobatch"
$0 stop
$0 start
;;
esac
exit 0
使用此代码我收到此错误:
gobatch.service:步骤EXEC产生错误/etc/init.d/gobatch:执行格式错误
更新3:
日志文件中的最后一个错误是:
janv。 08 15:33:07 ubuntu systemd [1]:无法启动SYSV:ChilliSpot是一个开源的强制门户网站。
我希望在那之后,我的程序会有效。
答案 0 :(得分:1)
您的脚本会立即回复并退出,因此它不是守护程序。守护进程需要在调用后继续运行。
您需要拥有一个类似deamon的程序才能测试其安装。安装不会从常规程序中创建一个守护程序。它只会为运行它做好准备。
问题How do you create a daemon in Python?将为您提供有关如何在Python中编写正确守护程序的更多信息。
答案 1 :(得分:0)
我怀疑一旦你的gobatch
打印完成了执行。
尝试
#! /bin/bash
for i in $(seq 1 10)
do
echo "it works !"
sleep 1
done