2015-12-15 97 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