2009-09-14 87 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

相關問題