如何使Python脚本作为服务运行?
我想在CENTOS服务器上运行python脚本:如何使Python脚本作为服务运行?,python,linux,centos,Python,Linux,Centos,我想在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.tidcou
#!/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()
#/usr/bin/env python
导入套接字
尝试:
导入线程
除恐怖外:
导入线程作为线程#Py3K更改了它。
类Polserv(对象):
定义初始化(自):
self.numthreads=0
self.tidcount=0
self.port=843
self.sock=socket.socket(socket.AF\u INET,socket.sock\u STREAM)
self.sock.setsockopt(socket.SOL_socket,socket.SO_REUSEADDR,1)
自套接字绑定(('100.100.100.100',自端口))
赛尔夫,袜子,听(5)
def运行(自):
尽管如此:
thread.start\u new\u线程(self.handle、self.sock.accept())
def手柄(自身、连接、地址):
self.numthreads+=1
self.tidcount+=1
tid=self.tidcount
尽管如此:
数据=conn.recv(2048)
如果没有数据:
康涅狄格州关闭
self.numthreads-=1
打破
#如果数据中有“\0”:
康涅狄格州森德尔(b)“)
康涅狄格州关闭
self.numthreads-=1
打破
#conn.sendall(b“[#%d(%d个正在运行)]%s”%(tid,self.numthreads,data))
Polserv().run()
我使用的是$python flashpolicyd.py
,效果很好。。。
问题是:即使在我关闭终端(控制台)后,如何保持此脚本运行?我使用代码对应用程序进行后台监控。它允许您使用以下命令启动/停止/重新启动脚本
python myscript.py start
python myscript.py stop
python myscript.py restart
除此之外,我还有一个控制我的服务的脚本。这允许您在操作系统启动时自动启动服务
下面是一个简单的例子,让你开始。只需将代码移动到类中,然后从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
supervisorctl update
supervisorctl restart flashpolicyd
然后,您可以使用start/stop/restart来管理您的服务
e、 g
有一个更详细的使用upstart的示例
Systemd
如果您运行的操作系统使用Systemd(例如CentOS 7),您可以查看以下内容。我提供两个建议: 监督员 1) 安装
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
start on started sshd
stop on runlevel [!2345]
exec /usr/bin/python /opt/my_service.py
respawn
supervisorctl update
supervisorctl restart flashpolicyd
systemd(如果当前由Linux发行版使用) 将此文件放入
/etc/systemd/system/my_daemon.service
中,并使用systemctl daemon reload&&systemctl enable my_daemon&&systemctl start my_daemon启用我的_daemon--no block
要查看日志,请执行以下操作:
systemctl status my_daemon
首先在应用程序中导入操作系统模块,然后使用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/servername停止
/etc/init.d/servername start我的非Python方法将使用&后缀。即:
python flashpolicyd.py &
停止脚本
killall flashpolicyd.py
此外,带有disown的管道和后缀会将流程置于superparent(上):
对于我的python脚本,我使用 要启动python脚本,请执行以下操作:
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON
PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE
要停止python脚本,请执行以下操作:
start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --exec $DAEMON
PID=$(cat $PIDFILE)
kill -9 $PID
rm -f $PIDFILE
旁白:对不起,我的英语很差,我来自智利:D可能是重复的,但不是完全重复的——链接到的问题是关于一个重复的任务,这是关于一个网络守护进程;另一个的解决方案是cron,这个的解决方案是inetd(或等效的)。好的。。但是我不知道如何在我的脚本中使用这个类。。。您可以教我吗?您将如何在MyDaemon中使用init.d脚本?假设Daemon分叉MyDaemon进程,这种可能性可能分叉一个新进程,然后它可能尝试重新启动——因为它认为脚本已经完成(导致运行python进程的次数达到1000次)。您可以用简单的python Dameon提供一个init.d的快速/简单示例吗?@sigi:除非脚本实际完成,否则python守护进程应该阻止任何新进程启动,但您可以始终在init.d脚本中检查pid文件。如果你需要一个合适的例子,我可以在一两天内有时间的时候更新答案。@eandersson:我认为你提到的python守护进程脚本会执行两次进程分叉,因此init.d(Upstart)我认为需要在“.conf”文件中有一个“expect daemon”命令或类似的命令。。。我只是想知道如何让Upstart.conf文件使用您提到的daemonizer脚本寻找一个简单的python守护进程-例如,一个简单的示例,说明如何使用init.d脚本来控制您的服务将非常好。。。谢谢。@MohitC:不幸的是,这有点离题了。我建议你打开一个新问题,专门用于妖魔化多进程应用程序。最后一个问题不起作用(Ubuntu 16.04):
-bash:意外标记“|”附近的语法错误。
超级简单方法:)你好@Freude!我在回答中添加了一个systemd
daemon配置。许多Linux现在为init脚本提供了systemd
,配置与supervisord非常相似。服务文件应在/lib/systemd/system/下创建。是否可以在execstart上写入相对路径?使用这种systemd方法,我可以使守护进程工作,但在重新启动后无法使用以下命令启动错误:已删除作业活动\u controller.service/start以中断从sysinit.target/start开始的订购周期