如何阻止 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 插件。
我正在 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":
$ 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 插件。