【问题标题】:changing the process name of a python script [duplicate]更改python脚本的进程名称[重复]
【发布时间】:2011-01-16 08:39:32
【问题描述】:

有没有办法更改在 Linux 上运行 python 脚本的进程的名称?

当我执行ps 时,我得到的只是“python”进程名称。

【问题讨论】:

    标签: python linux


    【解决方案1】:

    有更简单的方式(您不需要导入任何库)但可能不是那么优雅。您必须不要在 shebang 行中使用“env”。

    也就是说,这将在进程列表中被命名为“python”:

    #!/usr/bin/env python
    

    但这会以你的脚本名命名:

    #!/usr/bin/python
    

    因此,您可以使用 pidof -x scriptnameps -C scriptname 之类的内容找到它

    【讨论】:

    • 这正是我想要的。谢谢
    • 在我们处理 bash 文件时有效。谢谢。
    • 虽然这确实违背了使用 env 的目的。
    • @ChristopherBarber env 的“目的”是debatable,无论如何,大多数使用它的人通常都不太了解。在我看来,这只是 避免 以 env 为前缀的另一个原因。
    • 这似乎不适用于 centos 7,知道为什么吗?我仍然可以看到 python 脚本名,即使我从 shell 运行时只使用 ./scriptname.py
    【解决方案2】:

    http://code.google.com/p/procname/

    示例用法:

    # Lets rename:    
    >>> procname.setprocname('My super name')    
    
    # Lets check. Press Ctrl+Z       
    user@comp:~/procname$ ps
    
        PID TTY TIME CMD 
    
    13016 pts/2 00:00:00 bash
    
    13128 pts/2 00:00:00 My super name <-- it's here
    

    它仅适用于存在prctl 系统调用并支持PR_SET_NAME 命令的系统。

    【讨论】:

    • 整洁!有没有办法执行相同的操作而不导致C 扩展的额外复杂性?
    • bugs.python.org/issue5672 让我觉得,不,没有:-(
    • 在那张票中,他们还提到了另一个进程名称更改工具(也在 C 中):code.google.com/p/py-setproctitle/source/browse/tools
    • +1:好东西!谢谢!
    • 似乎不再支持此包。我收到一个导入错误undefined symbol: Py_InitModule3
    【解决方案3】:

    procname 库在 ubuntu 上对我不起作用。我改用 setproctitle (pip install setproctitle)。这就是 gunicorn 的用途,它对我有用。

    【讨论】:

      【解决方案4】:

      可以选择执行以下操作,尽管它仅适用于 linux(使用 prctl(2) 调用)

      if sys.platform == 'linux2':
          import ctypes
          libc = ctypes.cdll.LoadLibrary('libc.so.6')
          libc.prctl(15, 'My Simple App', 0, 0, 0)
      

      【讨论】:

      • 不适用于 Debian 6、x86_64。
      • 两者都不适用于 ubuntu :(
      • 尝试用 PR_SET_NAME 替换 16
      • 在 Ubuntu 12.04 / Linux 3.1.10 x86_64 上使用 Python 2.7 成功测试。 注意:确实更改了 ps 中看到的名称,但不会更改 ps w 返回的 cmdline。
      • Python 3(分号表示行,因为 SO 上没有多行)``` libc.prctl(15, b"New Name", None, None, None); # 并检索:(我不知道你是否必须用一个以上的字节来初始化 c_char_p,但首先分配正确的内存量似乎更正确); proc_name = ctypes.c_char_p(b"\0" * 16); libc.prctl(16,proc_name,无,无,无);打印(proc_name.value); ```
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 2020-02-26
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多