2010-08-23 3 views
3

У меня есть сценарий питона, который запускает ряд C++ программ, каждая программа передается параметр командной строки, как показано нижеPython: Изменение имени процесса с setproctitle

process_path "~/test/" 
process_name "test" 
num_process = 10 

for p in range(1, num_processes, 1): 
    subprocess.Popen([process_path + process_name, str(p)], shell = False) 

Можно ли нам setproctitle переименовать каждый из этого процесса, чтобы я мог включить параметр командной строки как часть имени процесса, если да, как бы вы это сделали?

+1

AFAIK, 'setproctitle' может использоваться только процессом для изменения собственного названия, а не для изменения названия другого процесса. Поэтому программа C++ должна сама вызвать 'setproctitle'. – Constantin

+0

thanks, constantin – mikip

+0

Ну, может быть и другое творческое решение ... – Constantin

ответ

1

Если вы передаете kwarg executable к subprocess.Popen, вы можете использовать первый аргумент в списке аргументов:

subprocess.Popen(['some string you choose', str(p)], 
       executable=process_path+process_name, shell=False) 

docs сказать: «В Unix, она становится отображаемое имя для выполняемой программы в ЖКХ таких как ps. "

+0

Это не работает для меня (Ubuntu). Работает ли это для вас? – Constantin

1

setproctitle может изменить свое «собственное» название процесса, поскольку я бы предположил, что элемент безопасности, но метод перезаписи таблицы процессов - это древняя руткит-техника - так ясно, что это возможно.

Кроме того, setproctitle поддерживает несколько операционных систем, поэтому способ изменения информации о процессе может отличаться, но для объяснения я предполагаю, что вы используете это под Linux и видите, что у нас есть. ,

Linux использует prctl(), который выглядит так: вы используете prctl (PR_SET_NAME, «my_new_name») ;, и это работает только в вызывающем процессе. Таким образом, не похоже, что есть простой способ сделать это с помощью модуля setproctitle - вы можете только модифицировать себя.

Ваш лучший выбор - изменить свой код на C++, чтобы он использовал prctl.

Если вы не используете Linux, разместите то, что используете, поскольку другие операционные системы предоставляют другие возможности и методы, которые сильно отличаются от ограничений prctl.

0

Windows-only: имя процесса обычно означает фактическое исполняемое изображение, которое выполняется (например, calc.exe). С другой стороны, название процесса с другой стороны (это текст, отображаемый на панели задач) можно легко изменить для приложений консоли (CUI), используя команду запуска вместо непосредственного запуска приложения (указать заголовок как первый аргумент, использовать start/для получения дополнительной информации):

for p in range(1, num_processes, 1): 
    subprocess.Popen(['start', str(p), process_path + process_name, str(p)], shell = False) 
    #       ^this is the title 

Для приложений с графическим интерфейсом это немного сложнее и гораздо реже будет необходимо.

Смежные вопросы