Есть ли способ изменить эффективное имя процесса в Python?
могу ли я изменить эффективное имя процесса скрипта Python? Я хочу показать другое имя, а не имя процесса, когда я получаю список процессов системы. В C я могу установить
strcpy(argv[0],"othername");
но в Python
argv[0] = "othername"
не работает. Когда я получаю список процессов (с ps ax в моем linux box) настоящее имя не меняется. Я предпочитаю портативное решение (или другое решение для posix и другое для сред windows), если оно существует.
спасибо заранее
8 ответов:
проще говоря, нет переносимый способ. Вам нужно будет протестировать систему и использовать предпочтительный метод для этой системы.
кроме того, я смущен тем, что вы подразумеваете под именами процессов в Windows.
вы имеете в виду имя сервиса? Я предполагаю это, потому что ничто другое не имеет никакого смысла (по крайней мере, для моих не-Окон, использующих мозг).
Если да, то вам нужно использовать интерфейс WMI Тима Голдена и позвонить .Измените метод на службе... на по крайней мере, согласно его учебник.
для Linux ни один из методов, которые я нашел, не работал, кроме это плохо упакованный модуль устанавливает, что argv[0] для вас.
Я даже не знаю, будет ли это работать на вариантах BSD (у которых есть системный вызов setproctitle). Я почти уверен, что argv[0] не будет работать на Solaris.
недавно я написал модуль Python, чтобы изменить название процесса портативным способом: check https://github.com/dvarrazzo/py-setproctitle
Это оболочка вокруг кода, используемого PostgreSQL для выполнения изменения заголовка. В настоящее время он тестируется на Linux и Mac OS X: Windows (с ограниченной функциональностью) и BSD-портинги находятся в пути.
Edit: по состоянию на июль 2010 года, модуль работает с BSD и с ограниченной функциональностью на Windows, и был портирован на Python 3.x.
на самом деле вам нужно 2 вещи на linux: изменить
argv[0]СC(дляps auxfи друзья) и звонитеprctlСPR_SET_NAMEфлаг.нет абсолютно никакого способа сделать первую часть из самого python. Хотя, вы можете просто изменить имя процесса, вызвав 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покажет только 'python' после этого :(. Ноtopиps -Aпокажет новое имя процесса "тестирование да":). Такжеkillallиpkillбудет работать с новыми имя.кстати, procname из googlecode также изменяется
argv[0], таким образом, даже измененияps auxfвыход.обновление: решение, опубликованное в этом ответе, иногда не играет хорошо на FreeBSD. Теперь я использую py-setproctitle указано в ответ в течение года или около того на различных коробках linux и freebsd. Нет провалов до сих пор! Все должны тоже! :). Он использует почти тот же код, что и PostgreSQL использует в его основной базе данных и дочерних процессах.
посмотреть setproctitle пакета
Это достаточно портативная версия и работает на многих платформах.
во-первых, я не уверен, что просто настройки
argv[0]в программе C переносно изменяет имя, показанное вps. Возможно, это происходит в некоторых unixen, но я понимаю, что этого не ожидается.во-вторых, поскольку Windows специально не совместима с POSIX, только несколько вещей "переносятся" между POSIX и non-POSIX. Поскольку вы конкретно говорите "ps", Я предполагаю, что POSIX является вашим приоритетом, и Windows может не работать.
что еще более важно, мое понимание изменение
argv[0]- Это вызовexecчтобы сделать эти изменения. В частности,execвызов имеет как путь к исполняемому файлу, так и отдельныйargvсписок. Выполнение собственного вызова позволяет нарушить соглашение оболочки о вводе имени исполняемого файла вargv[0].у вас есть управление процессом библиотеки ОС, который дает вам прямой доступ к библиотеке ОС для этого. Можно разбить сценарий на две части -- стартер и "реальная работа." Стартер устанавливает среду выполнения и исполняет реальную работу с требуемыми параметрами.
в C, вы заменяете свой собственный процесс с другим. В Python вы заменяете старый интерпретатор Python на новый, который имеет другой argv[0]. Надеюсь, он не будет сопротивляться этому. Некоторые программы проверяют argv[0], чтобы решить, что они делают.
у вас тоже есть подпроцесс.попен что вы можете использовать для установки желаемых args и выполнимый. В этом случае, однако, родительский процесс должен задерживаться, чтобы собрать ребенка, когда ребенок закончит. Родитель не может делать ничего больше, чем
Popen.wait
мой ответ на подобный вопрос помечен как дублировать:
там проще (вам не нужно импортировать какие-либо библиотеки), но, возможно, не так элегантно. Вы не должны использовать "env" внутри линии shebang.
другими словами, это будет называться "python" в списке процессов:
#!/usr/bin/env pythonно это будет называться с вашим scriptname:
#!/usr/bin/python, так что вы сможете найти его с чем-то вроде
pidof -x scriptnameилиps -C scriptname
Я нашел python-prctl очень хорошо работать под Linux. Вам придется найти что-то еще для Windows.
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обратите внимание на один '=' знак
Comments