Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2009 15:48:45

Pattern
От:
Зарегистрирован: 2009-05-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Pid запущенного процесса

Привет всем!
Стоит задача:
1) получить PID запущенного процесса из под Python
2) отследить тот момент, когда программа будет закрыта пользователем.
До второго пункта вопроса пока не дошёл, так как столкнулся с проблемой в первом вопросе.
Сама по себе задачка достаточно тривиальная

import os
pid=os.spawnlp(os.P_NOWAIT,'/Programs/bin/soffice','soffice','my_doc.doc')
print pid
Запускаем
$ python process.py
23409
$ I18N: Operating system doesn't support locale ""
I18N: Operating system doesn't support locale "en_US"
Xlib: extension "Generic Event Extension" missing on display ":0.0".
QTextCodec: using KOI8-R, probe failed (e0 ce ru)
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Failed to initialize GEM. Falling back to classic.

$
Открывается my_doc.doc. Проверяем что вернулся верный PID
$ ps ax | grep soffice
23409 p1 I 0:00,01 /bin/sh /Programs/bin/soffice my_doc.doc
23414 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23415 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23416 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23417 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23419 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23421 p1 I 0:00,00 /bin/sh /Programs/bin/soffice my_doc.doc
23422 p1 I 0:00,00 /bin/sh /Programs/OpenOffice-EN3.0.1/bin/soffice my_doc.doc
23426 p1 I 0:00,01 /bin/sh /Programs/OpenOffice-EN3.0.1/openoffice.org-3.0.1/openoffice.org3/program/soffice my_doc.doc
23434 p1 S 0:11,89 /Programs/OpenOffice-EN3.0.1/openoffice.org-3.0.1/openoffice.org3/program/soffice.bin my_doc.doc
24655 p2 S+ 0:00,00 grep soffice
$
Как я полагаю, был возвращён PID первого запущенного процесса. Как вариант допустимо.
Однако, может возникнуть такая ситуация, что OpenOffice уже будет открыт.
Запускаю OpenOffice, создаю в нём новый документ, пишу что то от балды и оставляю открытым. Далее
$ python process.py
29129
$ I18N: Operating system doesn't support locale ""
I18N: Operating system doesn't support locale "en_US"
Xlib: extension "Generic Event Extension" missing on display ":0.0".
QTextCodec: using KOI8-R, probe failed (e0 ce ru)
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Xlib: extension "Generic Event Extension" missing on display ":0.0".
Failed to initialize GEM. Falling back to classic.

$
Как и полагается в новом окне открывается my_doc.doc. Проверяю PID
$ ps ax | grep soffice
28843 ?? I 0:00,01 /bin/sh /Programs/bin/soffice
28848 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28849 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28850 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28852 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28853 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28855 ?? I 0:00,00 /bin/sh /Programs/bin/soffice
28856 ?? I 0:00,00 /bin/sh /Programs/OpenOffice-EN3.0.1/bin/soffice
28860 ?? I 0:00,01 /bin/sh /Programs/OpenOffice-EN3.0.1/openoffice.org-3.0.1/openoffice.org3/program/soffice
28868 ?? S 0:12,51 /Programs/OpenOffice-EN3.0.1/openoffice.org-3.0.1/openoffice.org3/program/soffice.bin
29653 p2 S+ 0:00,00 grep soffice
$ ps ax | grep 29129
29754 p2 S+ 0:00,01 grep 29129
$
Ничего не понимаю, куда девался PID или как получить PID реального процесса?
Как я понимаю, данная ситуация связана с работой самого OpenOffice, нежели с глюком Python. Но в любом случае, как решить данный вопрос я не знаю.
Спасибо всем отозвавшимся.



Офлайн

#2 Май 6, 2009 10:07:50

Pattern
От:
Зарегистрирован: 2009-05-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Pid запущенного процесса

Или задача настолько проста, что кому либо не охото на неё ответить, либо на столько сложна, что нет решений.
В любом случае, не уже ли нет никаких примерных решений этой проблемы?



Офлайн

#3 Май 6, 2009 10:33:47

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Pid запущенного процесса

Потыкался - у меня сколько бы не было открыто документов присутствует только один процесс soffice, похоже что он на запуске ищет уже запущенный экземпляр и если находит сообщает ему имя файла и завершается. Но тогда мне непонятен ваш результат ps



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Май 6, 2009 16:48:15

Pattern
От:
Зарегистрирован: 2009-05-05
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Pid запущенного процесса

Но тогда мне непонятен ваш результат ps
Вывод первого ps думаю понятен без пояснений. Второй поясняю. Python запускает ОО3 и возвращает PID полученного запущенного процесса
29129
Соответсвенно, я через ps проверяю, верные ли это данные
ps ax | grep soffice
Результат возвращает список процессов содержащих soffice, но PID'а 29129 в нем нет. Соответственно, тут 2 варианта: либо под данным PID'ом сидит командная строка другого формата, а именно не содержащая soffice, либо этого процесса просто не существует. Поэтому, чтобы в этом убедиться, проверяем существует ли данный PID и если есть, что на нём висит
ps ax | grep 29129
Возвращается пустой результат, что означает PID'а в системе не существует (нет данного процесса).
Я не могу в точности утверждать принцип работы OO3 (потому что просто напросто его не знаю), но преполагаю, что эта “фича” MDI-окон.
В первом случае, когда ОО3 не запущен в системе, запущенный из под Python процес является родителем для всех последующих окон
23409  p1  I      0:00,01 /bin/sh /Programs/bin/soffice my_doc.doc
и полученный PID будет актуален до того момента, пока OO3 не выгрузят из системы (проще гвооря, не закончат с ним работать).
Во втором случае, родительским является тот, который появился в системе при создании нового документа.
28843  ??  I      0:00,01 /bin/sh /Programs/bin/soffice
Сравните с предыдущим и вы увидите разницу. Соответственно, если это MDI, каждый последующий процесс будет “примыкать” к существующему родительскому. Опять таки же - это предположительно.
Меня больше всего интересует другой вопрос: даже если PID процесса поменялся (??? не понятно как), как отловить PID именно того окна, в котором редактируется my_doc.doc, ведь параметры командной строки всех существующих процессов остаются как у родительского процесса?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version