如何让 Python 脚本作为服务运行?

2024-10-25 08:42:00
admin
原创
222
摘要:问题描述:我想在 CENTOS 服务器中运行一个 python 脚本:#!/usr/bin/env python import socket try: import thread except ImportError: import _thread as thread #Py3K c...

问题描述:

我想在 CENTOS 服务器中运行一个 python 脚本:

#!/usr/bin/env python
import socket
try:    
    import thread 
except ImportError:
    import _thread as thread #Py3K changed it.
class Polserv(object):
    def __init__(self):
        self.numthreads = 0
        self.tidcount   = 0
        self.port       = 843
        self.sock       = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.sock.bind(('100.100.100.100', self.port))
        self.sock.listen(5)
    def run(self):
        while True:
            thread.start_new_thread(self.handle, self.sock.accept()) 
    def handle(self,conn,addr):
        self.numthreads += 1
        self.tidcount   += 1
        tid=self.tidcount
        while True:
            data=conn.recv(2048)
            if not data:
                conn.close()
                self.numthreads-=1
                break
            #if "<policy-file-request/>" in data:
            conn.sendall(b"<?xml version='1.0'?><cross-domain-policy><allow-access-from domain='*' to-ports='*'/></cross-domain-policy>")
            conn.close()
            self.numthreads-=1
            break
        #conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) )
Polserv().run()

我正在使用$ python flashpolicyd.py,它运行良好...问题是:即使在关闭终端(控制台)后如何保持该脚本继续运行?


解决方案 1:

我提出两点建议:

主管

1)安装supervisor软件包(更多详细说明请参见此处):

sudo apt-get install supervisor

2)为您的守护进程创建一个配置文件/etc/supervisor/conf.d/flashpolicyd.conf

[program:flashpolicyd]
directory=/path/to/project/root
environment=ENV_VARIABLE=example,OTHER_ENV_VARIABLE=example2
command=python flashpolicyd.py
autostart=true
autorestart=true

3)重新启动supervisor以加载新.conf

supervisorctl update
supervisorctl restart flashpolicyd

systemd(如果您的 Linux 发行版当前正在使用)

[Unit]
Description=My Python daemon

[Service]
Type=simple
ExecStart=/usr/bin/python3 /opt/project/main.py
WorkingDirectory=/opt/project/
Environment=API_KEY=123456789
Environment=API_PASS=password
Restart=always
RestartSec=2

[Install]
WantedBy=sysinit.target

将此文件放入/etc/systemd/system/my_daemon.service并使用 启用它systemctl daemon-reload && systemctl enable my_daemon && systemctl start my_daemon --no-block

查看日志:

systemctl status my_daemon

解决方案 2:

我使用此代码来守护我的应用程序。它允许您start/stop/restart使用以下命令来执行脚本。

python myscript.py start
python myscript.py stop
python myscript.py restart

除此之外,我还有一个init.d脚本来控制我的服务。这允许你在操作系统启动时自动启动该服务。

这是一个简单的例子。只需将代码移到类中,然后从run里面的函数调用它即可MyDeamon

import sys
import time

from daemon import Daemon


class YourCode(object):
    def run(self):
        while True:
            time.sleep(1)


class MyDaemon(Daemon):
    def run(self):
        # Or simply merge your code with MyDaemon.
        your_code = YourCode()
        your_code.run()


if __name__ == "__main__":
    daemon = MyDaemon('/tmp/daemon-example.pid')
    if len(sys.argv) == 2:
        if 'start' == sys.argv[1]:
            daemon.start()
        elif 'stop' == sys.argv[1]:
            daemon.stop()
        elif 'restart' == sys.argv[1]:
            daemon.restart()
        else:
            print "Unknown command"
            sys.exit(2)
        sys.exit(0)
    else:
        print "usage: %s start|stop|restart" % sys.argv[0]
        sys.exit(2)

暴发户

如果您运行的是使用 Upstart 的操作系统(例如 CentOS 6),您也可以使用 Upstart 来管理服务。如果您使用 Upstart,您可以保留脚本原样,只需在/etc/init/my-service.conf

start on started sshd
stop on runlevel [!2345]

exec /usr/bin/python /opt/my_service.py
respawn

然后您可以使用启动/停止/重启来管理您的服务。

例如

start my-service
stop my-service
restart my-service

这里提供了使用 upstart 的更详细示例。

系统化

如果您正在运行使用 Systemd 的操作系统(例如 CentOS 7),您可以查看以下Stackoverflow 答案。

解决方案 3:

我的非 Python 方法是使用 & 后缀。即:

python flashpolicyd.py &

停止脚本

killall flashpolicyd.py

管道和带有 disown 的后缀也会将进程置于超父级(上层)之下:

python flashpolicyd.pi & disown

解决方案 4:

首先在您的应用程序中导入 os 模块,然后使用 getpid 函数获取 pid 的应用程序并保存在文件中。例如:

import os
pid = os.getpid()
op = open("/var/us.pid","w")
op.write("%s" % pid)
op.close()

并在 /etc/init.d 路径中创建一个 bash 文件:/etc/init.d/servername

PATHAPP="/etc/bin/userscript.py &"
PIDAPP="/var/us.pid"
case $1 in 
        start)
                echo "starting"
                $(python $PATHAPP)
        ;;
        stop)
                echo "stoping"
                PID=$(cat $PIDAPP)
                kill $PID
        ;;

esac

现在,您可以使用 down 命令启动和停止您的应用程序:

服务 服务器名称 stop 服务 服务器名称 start

或者

/etc/init.d/服务器名称停止/etc/init.d/服务器名称启动

解决方案 5:

对于我的 python 脚本,我使用......

启动python脚本:

start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON

停止 Python 脚本:

PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE

附言:抱歉我的英语不好,我来自智利:D

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2599  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1556  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   38  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   32  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   28  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用