如何阻止 cherrypy 自动重新加载更改 Debian 上的进程名称?

How to stop cherrypy auto-reload from changing the process name on Debian?

我正在 debian 上使用 cherrypy 开发一个项目。在我的工作中,管理员希望在使用 ps -e 等命令时看到项目名称而不是显示 "python"。但是cherrypy在修改一个源文件时自动重载时,会自动更改进程名。

例如,如果我把最基本的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())

通过在开头添加 shebang,当我启动它时 $ ./NameToSee.py &,我得到一个名称为 "NameToSee.py":

的进程(比如 31051)
$ head /proc/31051/status
Name:   NameToSee.py
State:  S (sleeping)

但是,每当我更改源代码文件(例如,通过添加一个空行)时,进程名称都会更改:

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

所以,我的问题是:我可以同时获得 cherrypy 自动重新加载和自定义进程名称吗?如果不能,我可以删除 cherrypy 自动重新加载吗? ?

我 运行 使用 debian wheezy,python 2.7.3 和 cherrypy 3.2.2

此示例涵盖两种情况:

import cherrypy
from cherrypy.process.plugins import SimplePlugin

PROC_NAME = 'sample'


def set_proc_name(newname):
    """                                                                                                                                                                                                      
    Set the process name.                                                                                                                                                                                    
    Source:                                                                                                                                                          
    """
    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()

您可以使用以下方法进行测试:

cat /proc/`pgrep  sample`/status

(或者可能只是使用 pgrep)

作为最终建议,请考虑使用 "production" 环境 (see the docs),其中还包括禁用 autoreload 插件。