문제

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

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

그러나 파이썬에서

argv[0] = "othername"

작동하지 않는 것 같습니다. 프로세스 목록을 얻을 때 ( ps ax 내 Linux 상자에서) 실명은 변경되지 않습니다. 휴대용 솔루션 (또는 POSIX 용 하나의 솔루션 및 Windows 환경을위한 다른 솔루션)을 선호합니다.

미리 감사드립니다

도움이 되었습니까?

해결책

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

또한 Windows의 프로세스 이름이 의미하는 바에 대해 혼란스러워합니다.

서비스 이름을 의미합니까? 나는 다른 것이 실제로 어떤 의미가 없기 때문에 (적어도 뇌를 사용하는 내 비 의상에) 아무것도 의미가 없기 때문입니다.

그렇다면 사용해야합니다 팀 골든의 WMI 인터페이스 그리고 서비스에서 .Change 방법을 호출하십시오 ... 적어도 그의 것에 따라 지도 시간.

Linux의 경우 내가 찾은 방법 중 어느 것도 이 제대로 포장 된 모듈 그것은 당신을 위해 argv [0]를 설정합니다.

이것이 BSD 변형에서 작동하는지조차 모르겠습니다 (SetProctitle 시스템 호출이 있습니다). 나는 Argv [0]이 Solaris에서 작동하지 않을 것이라고 확신합니다.

다른 팁

최근에 Python 모듈을 작성하여 프로세스 제목을 휴대용 방식으로 변경했습니다. https://github.com/dvarrazzo/py-setproctitle

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

편집하다: 2010 년 7 월 현재이 모듈은 BSD에서 작동하며 Windows에서 기능이 제한되어 있으며 Python 3.X로 포팅되었습니다.

실제로 Linux에서 두 가지가 필요합니다 : 수정 argv[0] ~에서 C (을 위한 ps auxf 그리고 친구) 및 전화 prctl ~와 함께 PR_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 그 후에 '파이썬'을 보여줄 것입니다 :(.하지만 top 그리고 ps -A 새로운 '테스트 예'프로세스 이름 :). 또한 killall 그리고 pkill 새 이름으로 작동합니다.

BTW, GoogleCode의 ProcName도 변경됩니다 argv[0], 따라서, 심지어 변화 ps auxf 산출.

업데이트:이 답변에 게시 된 솔루션은 FreeBSD에서 때때로 멋지게 재생되지 않습니다. 나는 지금 사용하고있다 py-setproctitle 정해진 이 대답에서 다양한 Linux 및 FreeBSD 상자에서 1 년 정도. 지금까지 실패하지 않습니다! 모두가해야합니다! :). 거의 같은 코드를 사용합니다 PostgreSQL 용도 주요 데이터베이스 및 자식 프로세스에서.

살펴보십시오 SetProctitle 패키지

이것은 휴대용 버전이며 많은 플랫폼에서 작동합니다.

첫째, 단순히 설정이 확실하지 않습니다 argv[0] C 프로그램에서 표시된 이름을 완성하게 변경합니다. ps. 어쩌면 그것은 Unixen에서 할 수도 있지만, 내 이해는 그것이 예상되지 않는다는 것입니다.

둘째, Windows는 구체적으로 비 POSIX를 준수하기 때문에 POSIX와 비 포스 사이에 몇 가지 사항 만 "휴대용"입니다. 구체적으로 'PS'라고 말하면 POSIX가 귀하의 우선 순위이고 Windows가 작동하지 않을 수 있다고 가정합니다.

더 중요한 것은 변화에 대한 나의 이해입니다 argv[0] 전화가 필요하다는 것입니다 exec 이러한 변경을 위해. 구체적으로, exec 전화에는 실행 파일의 경로와 별도의 경로가 있습니다. argv 목록. 자신의 전화를 걸면 실행 파일 이름을 argv[0].

당신은 가지고 있습니다 OS 라이브러리 프로세스 관리 이를 위해 OS 라이브러리에 직접 액세스 할 수 있습니다. 스크립트를 스타터와 "실제 작업"의 두 부분으로 나누는 것을 고려해야합니다. 스타터는 런타임 환경을 확립하고 Exec는 원하는 매개 변수를 사용한 실제 작업입니다.

C에서는 자신의 프로세스를 다른 프로세스로 대체하고 있습니다. Python에서는 오래된 Python 통역사를 다른 ArgV [0]를 가진 새로운 것으로 바꾸고 있습니다. 바라건대, 그것은 이것에 쫓지 않을 것입니다. 일부 프로그램은 ArgV [0]를 확인하여 그들이하고있는 일을 결정합니다.

당신도 가지고 있습니다 하위 프로세스 .popen 원하는 args 및 실행 파일을 설정하는 데 사용할 수 있습니다. 그러나이 경우 부모 과정은 아이가 끝날 때 아이를 모으기 위해 주위에 남아 있어야합니다. 부모는 Popen.wait

비슷한 질문에 대한 나의 대답 복제하다:

단순한 (리브를 가져올 필요는 없음)가 있지만 우아한 방법은 없을 것입니다. Shebang 라인 내부에서 "Env"를 사용하지 않아도됩니다.

다시 말해, 이것은 프로세스 목록에서 "Python"으로 명명됩니다.

#!/usr/bin/env python

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

#!/usr/bin/python

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

나는 찾았다 Python-PRCTL Linux에서 잘 작동합니다. 당신은 창문을 위해 다른 것을 찾아야합니다.

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

단일 '='부호에 주목하십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top