Python에서 효과적인 프로세스 이름을 변경하는 방법이 있습니까?


78

Python 스크립트의 유효 프로세스 이름을 변경할 수 있습니까? 시스템 프로세스 목록을 가져올 때 프로세스의 실제 이름 대신 다른 이름을 표시하고 싶습니다. CI에서 설정할 수 있습니다.

strcpy(argv[0],"othername");

하지만 파이썬에서는

argv[0] = "othername"

작동하지 않는 것 같습니다. 프로세스 목록 ( ps ax내 Linux 상자에 있음)을받을 때 실제 이름이 변경되지 않습니다. 존재한다면 휴대용 솔루션 (또는 posix 용 솔루션과 Windows 환경 용 솔루션)을 선호합니다.

미리 감사드립니다



1
요즘 Windows 용 솔루션이 있습니까? (Python 3.x를 사용할 수 있습니까?)보다 정확하게 : "Windows 작업 관리자"(CTRL + SHIFT + ESCAPE), 탭 "프로세스"는 python.exe가 아닌 첫 번째 열 "이미지 이름"에 사용자 지정 문자열을 표시해야합니다. 또는 pythonw.exe. NB : python.exe를 mycustomstring.exe에 복제하는 것보다 또 다른 솔루션;)
Basj

답변:


13

간단히 말해, 휴대용 방법이 없습니다. 시스템을 테스트하고 해당 시스템에 대해 선호하는 방법을 사용해야합니다.

또한 Windows에서 프로세스 이름이 의미하는 바에 대해 혼란 스럽습니다.

서비스 이름을 의미합니까? 나는 그렇게 생각한다. 왜냐하면 다른 것은 정말로 의미가 없기 때문이다 (적어도 두뇌를 사용하는 나의 비 Windows에게는).

그렇다면 Tim Golden의 WMI 인터페이스 를 사용 하고 적어도 그의 자습서 에 따라 서비스에서 .Change 메서드를 호출해야합니다 .

Linux의 경우 argv [0]을 설정하는 이 잘못 패키지 된 모듈 을 제외하고 내가 찾은 방법 중 어느 것도 작동 하지 않았습니다 .

나는 이것이 BSD 변형 (setproctitle 시스템 호출이 있음)에서 작동하는지조차 알지 못합니다. 저는 argv [0]이 Solaris에서 작동하지 않을 것이라고 확신합니다.


늦었다는 것을 알고 있지만 새로운 독자의 경우 Linux의 CPython에 대한 빠르고 간단한 @MattWritesCode 답변 도 고려하십시오 .
bufh

86

최근에 이식 가능한 방식으로 프로세스 제목을 변경하는 Python 모듈을 작성했습니다. https://github.com/dvarrazzo/py-setproctitle 확인

제목 변경을 수행하기 위해 PostgreSQL에서 사용하는 코드를 감싸는 래퍼입니다. 현재 Linux 및 Mac OS X에 대해 테스트되었습니다. Windows (제한된 기능 포함) 및 BSD 포팅이 진행 중입니다.

편집 : 2010 년 7 월부터이 모듈은 BSD와 Windows에서 제한된 기능으로 작동하며 Python 3.x로 포팅되었습니다.


Windows에 설치할 수 없습니다.
사용자

@user는 신경 쓰지 않습니다. Windows에서는별로 도움이되지 않지만 할 일이별로 없습니다.
piro

ps -f에 의해 표시되는 인수를 변경하는 방법이 있습니까? 프로그램 이름 (항상 파이썬)은 신경 쓰지 않지만 표시된 인수를 변경하고 싶습니다.
KillianDS 2014 년

1
@KillianDS : "ps -f"의 출력을 "ps"의 출력과 다르게 원하십니까? 당신은 그것을 afaik 가질 수 없습니다.
piro

그것은 파이썬 모듈이 아닙니다. C 모듈입니다.
Bachsau

56

실제로 리눅스에서는 두 가지가 필요합니다 : (for 및 friends) argv[0]에서 수정 하고 플래그로 호출하십시오 .Cps auxfprctlPR_SET_NAME

파이썬 자체에서 첫 번째 조각을 할 수있는 방법은 전혀 없습니다. 그러나 prctl을 호출하여 프로세스 이름을 변경할 수 있습니다.

def set_proc_name(newname):
    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)

def get_proc_name():
    from ctypes import cdll, byref, create_string_buffer
    libc = cdll.LoadLibrary('libc.so.6')
    buff = create_string_buffer(128)
    # 16 == PR_GET_NAME from <linux/prctl.h>
    libc.prctl(16, byref(buff), 0, 0, 0)
    return buff.value

import sys
# sys.argv[0] == 'python'

# outputs 'python'
get_proc_name()

set_proc_name('testing yeah')

# outputs 'testing yeah'
get_proc_name()

ps auxf그 :( 후 바로 '파이썬'을 보여줄 것이다. 그러나 topps -A프로세스 이름을 : '그래 테스트'새로운 표시됩니다. 또한 killallpkill새 이름으로 작동합니다.

btw, googlecode의 procname도 변경 argv[0]되므로 ps auxf출력 도 변경 됩니다.

업데이트 :이 답변에 게시 된 솔루션은 때때로 FreeBSD에서 잘 작동하지 않습니다. 나는 이제이 답변 에 명시된 py-setproctitle 을 다양한 Linux 및 freebsd 상자에서 1 년 정도 사용하고 있습니다. 지금까지 실패하지 않았습니다! 모두가해야합니다! :). PostgreSQL 이 기본 데이터베이스 및 하위 프로세스에서 사용 하는 것과 거의 동일한 코드를 사용 합니다.


procname은 PyPy에서 작동하지 않습니다 (CPython에서만) setproctitle을 사용해야합니다.
radtek

13

setproctitle 패키지 살펴보기

이것은 꽤 이식 가능한 버전이며 많은 플랫폼에서 작동합니다.

pip install setproctitle

 

import setproctitle

setproctitle.setproctitle('new proc title as seen in top')

1
여기에 아름다운 간단한 솔루션.
David Parks

Linux에서 완벽하게 작동합니다. Windows에서 실제로 작동하지 않으며 setproctitle. 진정한 Windows 솔루션은 아마도 어려울 것입니다.
Frederic

4

첫째, argv[0]C 프로그램의 설정이 에 표시된 이름을 이식 가능하게 변경 하는지 잘 모르겠습니다 ps. 아마도 일부 유닉스에서 할 수 있지만 내 이해는 그것이 예상되지 않는다는 것입니다.

둘째, Windows는 특히 POSIX와 호환되지 않기 때문에 POSIX와 비 POSIX간에 "이동할 수있는"항목은 몇 가지뿐입니다. 구체적으로 'ps'라고 말 했으므로 POSIX가 우선 순위이며 Windows가 작동하지 않을 수 있다고 가정합니다.

더 중요한 것은 변화에 대한 저의 이해는 이러한 변화를 위해 argv[0]전화를 걸어야한다는 것 exec입니다. 특히 exec호출에는 실행 파일에 대한 경로와 별도의 argv목록이 있습니다. 직접 호출하면 실행 파일 이름을 argv[0].

이를 위해 OS 라이브러리에 직접 액세스 할 수있는 OS 라이브러리 프로세스 관리 가 있습니다. 스크립트를 시작과 "실제 작업"의 두 부분으로 나누는 것을 고려해야합니다. 스타터는 런타임 환경을 설정하고 exec는 원하는 매개 변수로 실제 작업을 수행합니다.

C에서는 자신의 프로세스를 다른 프로세스로 대체합니다. Python에서는 이전 Python 인터프리터를 argv [0]이 다른 새 인터프리터로 대체합니다. 바라건대, 이것은 이것을 망설이지 않을 것입니다. 일부 프로그램은 argv [0]을 확인하여 수행중인 작업을 결정합니다.

원하는 인수와 실행 파일을 설정하는 데 사용할 수 있는 subprocess.popen 도 있습니다 . 그러나이 경우 부모 프로세스는 자식이 끝날 때 자식을 수집하기 위해 계속 남아 있어야합니다. 부모는Popen.wait


1
아니요, Linux (및 기타 Unixes 일 가능성이 있지만 전부는 아님)에서 argv를 변경하면 즉시 프로세스 이름이 변경됩니다.이 이름은 널리 사용되는 많은 프로그램에서 프로세스에 대한 설명 이름을 제공하는 데 사용됩니다. ssh와 postgres 모두이 작업을 수행하고 일부는 현재 상태를 나타 내기 위해 즉시 이름을 변경합니다. Py_GetArgcArgv API 호출을 사용하여이를 수행하도록 Python 모듈을 작성할 수 있습니다.
Glenn Maynard

3

중복으로 표시된 유사한 질문에 대한 내 답변 :

더 간단하지만 (libs를 가져올 필요가 없음) 그렇게 우아한 방법은 아닙니다. shebang 라인 안에 "env"를 사용하지 않아도됩니다.

즉, 프로세스 목록에서 "python"으로 이름이 지정됩니다.

#!/usr/bin/env python

그러나 이것은 스크립트 이름으로 이름이 지정됩니다.

#!/usr/bin/python

그래서 당신은 pidof -x scriptname또는 같은 것을 찾을 수 있습니다ps -C scriptname



-18
In [1]: import sys

In [2]: print sys.argv[0]
C:\Python25\scripts\ipython.py

In [3]: sys.argv[0] = 'foo'

In [4]: print sys.argv[0]
foo

단일 '='기호에 유의하십시오.


3
그러나 ps (리눅스 상자의 프로세스 목록)를 실행하면 프로세스 이름이 정확히 동일하게 유지됩니다. 시도
Emilio

10
이것은 프로세스 이름을 전혀 변경하지 않습니다. Python의 argv 사본 만 변경합니다. 분명히 잘못된 대답을 삭제하는 것이 좋습니다.
Dakkaron
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.