2009-09-14 105 views
14

是否可以在网络服务器上运行Python脚本作为后台服务?我想为socket communication.我可以将Python脚本作为服务运行吗?

+0

有可能,更详细的回答请提供更多信息:您使用的是什么操作系统,您是否要在重新启动时启动服务等。 – 2009-09-14 19:32:28

+0

Windows或Unix环境? – dmeister 2009-09-14 20:03:04

+0

认为网络主机通常具有的“Unix/linux服务器”。 – 2009-09-14 20:11:38

回答

8

你可以使它成为一个守护进程。有一个更完整的解决方案的PEP,但我发现这很好。

import os, sys 

def become_daemon(our_home_dir='.', out_log='/dev/null', err_log='/dev/null', pidfile='/var/tmp/daemon.pid'): 
    """ Make the current process a daemon. """ 

    try: 
     # First fork 
     try: 
      if os.fork() > 0: 
       sys.exit(0) 
     except OSError, e: 
      sys.stderr.write('fork #1 failed" (%d) %s\n' % (e.errno, e.strerror)) 
      sys.exit(1) 

     os.setsid() 
     os.chdir(our_home_dir) 
     os.umask(0) 

     # Second fork 
     try: 
      pid = os.fork() 
      if pid > 0: 
       # You must write the pid file here. After the exit() 
       # the pid variable is gone. 
       fpid = open(pidfile, 'wb') 
       fpid.write(str(pid)) 
       fpid.close() 
       sys.exit(0) 
     except OSError, e: 
      sys.stderr.write('fork #2 failed" (%d) %s\n' % (e.errno, e.strerror)) 
      sys.exit(1) 

     si = open('/dev/null', 'r') 
     so = open(out_log, 'a+', 0) 
     se = open(err_log, 'a+', 0) 
     os.dup2(si.fileno(), sys.stdin.fileno()) 
     os.dup2(so.fileno(), sys.stdout.fileno()) 
     os.dup2(se.fileno(), sys.stderr.fileno()) 
    except Exception, e: 
     sys.stderr.write(str(e)) 
+0

在上面的代码片段中,我可以看到至少有一个问题:在尝试启动新实例之前,没有完成嗅探守护进程的存在。 – jldupont 2009-09-14 19:54:43

+1

嗅探?你的意思是检查守护进程是否已经在运行?如果是这样,在调用上述之前,这是在不同的过程中完成的。 – Robert 2009-09-14 21:40:25

+0

不错的演示,很好玩!有很多方法可以执行python守护进程,这是使用自定义shell调用的子进程(nohup,&),但这很容易理解。尼斯:) – 2013-01-20 16:20:13

7

你可能想看看Twisted

+0

我检查出来了,它很难理解。所以Twisted是一个Python库,它为任何通信任务保留一个python脚本永远运行? (例如套接字) – 2009-09-15 11:35:20

+2

Twisted是一个用于编写服务器的Python库。 一旦你编写了一个扭曲的服务器,你可以使用'twistd -y server.py'作为守护进程来运行它。 – Nathan 2010-08-02 14:57:38

0

如果你谈论的是Linux操作系统,它是做这样的事情./myscript.py &

+1

nohup ./myscript.py&将会通过 – 2009-09-14 19:37:22

+0

工作。我忽略提及nohup,因为我通常只是运行屏幕和分离,所以我没有必要这样做。这些downvoters是恶毒的。 – Unknown 2009-09-14 20:28:03

+0

但即使你正在运行屏幕,你还没有创建一个真正的守护进程,它仍然是你的屏幕会话的孩子。 nohup也不是最好的解决方案,但它是运行一次后台守护程序的快速方法。 – JimB 2009-09-14 20:43:06

2

在XP一样容易,以后你可以使用SC.EXE程序使用任何.exe文件作为服务:

>sc create 
Creates a service entry in the registry and Service Database. 
SYNTAX: 
sc create [service name] [binPath= ] <option1> <option2>... 
CREATE OPTIONS: 
NOTE: The option name includes the equal sign. 
type= <own|share|interact|kernel|filesys|rec> 
     (default = own) 
start= <boot|system|auto|demand|disabled> 
     (default = demand) 
error= <normal|severe|critical|ignore> 
     (default = normal) 
binPath= <BinaryPathName> 
group= <LoadOrderGroup> 
tag= <yes|no> 
depend= <Dependencies(separated by/(forward slash))> 
obj= <AccountName|ObjectName> 
     (default = LocalSystem) 
DisplayName= <display name> 
password= <password> 

你可以通过你的脚本启动Python解释器作为参数启动pythonscript:

python.exe myscript.py 
+0

我有一个.py Python脚本。 EXE在哪里? – 2009-09-14 19:27:26

+0

尝试py2exe http://www.py2exe.org – Yancy 2009-09-14 19:54:38

+0

你只需启动python解释器作为参数即可:python.exe myscript。py – 2009-09-14 20:06:10

相关问题