当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使Python脚本作为服务运行?》经验,为你挑选了4个好方法。

我想在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 "\0" in data:
            conn.sendall(b"")
            conn.close()
            self.numthreads-=1
            break
        #conn.sendall(b"[#%d (%d running)] %s" % (tid,self.numthreads,data) )
Polserv().run()

我正在使用$ python flashpolicyd.py,它工作正常......问题是:即使我关闭ssh控制台后如何保持此脚本运行?



1> eandersson..:

我使用此代码来守护我的应用程序.它允许您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

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



2> pztrick..:

我提出两条建议:

supervisord

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



3> shookees..:

我的非pythonic方法将使用&后缀.那是:

python flashpolicyd.py &

停止脚本

killall flashpolicyd.py

如果管道和带有disown的后缀会将过程置于superparent(upper)下:

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命令启动和停止您的应用程序:

服务服务器名停止服务服务器名开始

要么

/etc/init.d/服务器名称停止/etc/init.d/服务器名称开始

推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有