2015-12-15 34 views
0

我正在debian上開發一個使用cherrypy的項目。在我的工作中,管理員希望在使用像ps -e這樣的命令時看到項目的名稱而不是「python」。但是,當修改一個源文件時,cherrypy自動重新加載時,它會自動更改進程名稱。如何阻止cherrypy在Debian上自動更新進程名稱?

例如,如果我把最基本的CherryPy的教程,並將其保存NameToSee.py下:

#!/usr/bin/python 
import cherrypy 


class HelloWorld(object): 
    @cherrypy.expose 
    def index(self): 
     return "Hello world!" 

if __name__ == '__main__': 
    cherrypy.quickstart(HelloWorld()) 

通過添加家當在一開始,當我啓動它$ ./NameToSee.py &,我得到一個進程(比如31051)其名稱是「NameToSee.py」:

$ head /proc/31051/status 
Name: NameToSee.py 
State: S (sleeping) 

但是,每當我改變的源代碼文件(例如,通過添加一個空行),則處理名的變化:

$ head /proc/31051/status 
Name: python 
State: S (sleeping) 

所以,我的問題是:我可以同時獲得cherrypy自動重裝和自定義進程名稱嗎?如果沒有,可以刪除cherrypy自動重裝嗎?

我在Debian喘息運行,與Python 2.7.3和3.2.2的CherryPy

回答

2

本示例涵蓋這兩種情況下:

cat /proc/`pgrep sample`/status 

import cherrypy 
from cherrypy.process.plugins import SimplePlugin 

PROC_NAME = 'sample' 


def set_proc_name(newname): 
    """                                                  
    Set the process name.                                              
    Source: http://stackoverflow.com/a/923034/298371                                       
    """ 
    from ctypes import cdll, byref, create_string_buffer 
    libc = cdll.LoadLibrary('libc.so.6') 
    buff = create_string_buffer(len(newname)+1) 
    buff.value = newname 
    libc.prctl(15, byref(buff), 0, 0, 0) 


class NamedProcess(SimplePlugin): 
    """                                                  
    Set the name of the process everytime that the                                       
    engine starts.                                               
    """ 

    def start(self): 
     self.bus.log("Setting the name as '{}'".format(PROC_NAME)) 
     set_proc_name(PROC_NAME) 


class HelloWorld(object): 

    @cherrypy.expose 
    def index(self): 
     return "Hello world!" 


def run_without_autoreload(): 
    set_proc_name(PROC_NAME) 
    cherrypy.quickstart(HelloWorld(), config={ 
     'global': { 
      'engine.autoreload.on': False 
     } 
    }) 


def run_with_autoreload(): 
    # Work on any configuration but for the sake of the                                      
    # question this works with the autoreload.                                        
    NamedProcess(cherrypy.engine).subscribe() 
    cherrypy.quickstart(HelloWorld()) 


if __name__ == '__main__': 
    run_with_autoreload() 
    # run_without_autoreload() 

你可以用它進行測試

(或者只是使用pgrep)

作爲最終建議考慮使用「生產」環境(see the docs),其中還包括禁用自動重新加載插件。

+0

聽起來不錯。你知道是否有辦法動態獲取PR_SET_NAME的值,而不是在代碼中使用幻數? – DainDwarf