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

我想在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/>\0" 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 ,它工作正常…问题是:如何保持这个脚本运行,即使我closures了SSH控制台?

Solutions Collecting From Web of "如何使Python脚本作为服务运行?"

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

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

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

这是一个简单的例子,让你走。 简单地把你的代码移到一个类中,然后从MyDeamon里的run函数中调用它。

 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 

在这里可以找到更多与新贵合作的例子。

Systemd

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

我提供了两个建议:

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

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

 python flashpolicyd.py & 

停止脚本

 killall flashpolicyd.py 

管道和后缀disown将把过程放在superparent(上):

 python flashpolicyd.pi & disown 

首先在应用程序中导入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 

现在,你可以用下面的命令启动和停止你的应用程序:

服务servername停止服务servername启动

要么

/etc/init.d/servername stop /etc/init.d/servername start

对于我的Python脚本,我使用…

要启动python脚本:

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

要停止python脚本:

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

PS:对不起英文,我来自智利:D