Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使Python脚本作为服务运行?_Python_Linux_Centos - Fatal编程技术网

如何使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

我想在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()
#/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开始的订购周期