我的守护进程在启动后直接死亡

时间:2018-01-08 10:42:06

标签: python linux bash service daemon

我必须用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是一个开源的强制门户网站。

我希望在那之后,我的程序会有效。

2 个答案:

答案 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