Как определить имя процесса приложения?

13

Это ситуация:

Работая над (следующей версией) редактора быстрого списка Unity, я хотел бы добавить надежный способ «перезапуска» значков запуска. Для этого мне нужно убрать значок (редактирование gsettings) и заменить его на ту же позицию. Пока проблем нет. Однако, если рассматриваемое приложение работает, пользователь, возможно, потеряет данные, так как приложение закроется, когда его значок будет удален из модуля запуска. Мне нужен надежный способ найти имя процесса приложения, позволить редактору проверить список запущенных процессов, если приложение запущено, и отправить пользователю предупреждение о том, что значок нельзя перезапустить, если приложение Бег.

Пока что я сделал, чтобы редактор просмотрел файл рабочего стола, прочитал команду, также прочитал команду, извлеченную из раздела каталога, и, кроме того, изучил возможные удаленные сценарии, на которые может указывать команда файла рабочего стола, ища строки, начинающиеся с с "./"

Хотя этот метод, кажется, хорошо работает со всеми приложениями, на которых я его тестировал, я чувствую, что должен быть более простой способ решения проблемы «все в одном» ...

Есть?

Также приветствуются предложения поймать более исключительные ситуации!

Якоб Влейм
источник
Почему приложение закрывается, когда его значок удаляется из модуля запуска? Выход из приложения, которое не прикреплено к программе запуска, приводит к удалению его значка, но почему удаление значка приводит к выходу из приложения?
Элия ​​Каган
@Eliah: выход, вероятно, не правильное выражение, приложение просто падает ....
Джейкоб Влейм
@JacobVlijm, так что, это специфично для Unity, верно? У Unity уже есть механизм для этого. Какие требования? Только знать имя процесса так же, как в psи xpropвывод?
Сергей Колодяжный
@Serg Имя процесса, «рассчитанное» из .desktopфайла, которое не обязательно является WM_CLASS. WM_CLASS может быть установлен из приложения.
Джейкоб Влейм
@JacobVlijm ах, так что предположим, что вы начали firefox.desktop, он запускает Firefox с PID 1234, но изменился WM_CLASSна что-то вроде «Полностью не Firefox». .desktopФайл , однако , не меняется. Вы хотите получить имя, прикрепленное к PID 1234 независимо от WM_CLASS. Я думаю, что я вижу, что именно нужно сделать. Но вы не ответили на мой первый вопрос - это нормально, если это только для Unity?
Сергей Колодяжный

Ответы:

3

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

Upstart должен иметь дело с точно такой же проблемой, чтобы отследить, все ли еще работают демоны, и авторам заданий upstart нужно указать детали (количество вилок) для отслеживания upstart. Учитывая, что выскочка не может справиться с этим без помощи, я не думаю, что вы тоже можете. А выскочка даже контролирует способ запуска процессов, что, я думаю, вы не здесь.

Я думаю, что лучшее, что вы можете сделать, это то, что вы уже делаете. Глядя на это /proc/<pid>/statи /proc/<pid>/cmdlineявляется достаточно общим способом, но все равно не уловить каждый случай. Команда pgrepоборачивает это. Если вы еще не используете pgrep, взгляните на справочную страницу pgrep , чтобы найти варианты, с которыми вы можете сравнивать.

Сказав все это, я не уверен, что вам действительно нужно делать это в первую очередь. Если вы не можете отследить процесс, тогда я не вижу, как Unity могла бы это сделать. Разве лучше не было бы устранить сбои приложения? Я хотел бы изучить детали того, почему ваши приложения аварийно завершают работу (наверняка, это где-то ошибка?), А не пытаться обойти это, как вы описали. Интересно, влияет ли это только на приложения с поддержкой Unity, которые обращаются к Unity для получения дополнительной функциональности через DBus ?

Роби Басак
источник
Спасибо за исчерпывающий ответ! Я рассмотрю детали (особенно ваш последний абзац) и, возможно, предложу функцию «перезапустить» в качестве «экспериментальной» опции, если я не смогу найти 100% -ное решение. Хорошей новостью является то, что в то же время я не нашел исключений в методе, который я использовал. Еще раз спасибо!
Джейкоб Влейм
1

Команда xprop(сопровождаемая alt-tab в соответствующем окне приложения, затем один раз щелкните в окне), кажется, помогает мне.

el_gallo_azul
источник
WM_CLASSчасто соответствует имени процесса, но определенно не всегда. Определяя (кодируя) окно, я могу дать ему любое, WM_CLASSчто захочу. Даже сам сделал, чтобы окна, запущенные из разных процессов, группировались в одну иконку запуска.
Джейкоб Влейм
Ой. Это позор. Это стоило того, чтобы в конце я добавил заявление об отказе от ответственности "... кажется, делает свое дело". Это функция, которую я действительно ожидал встроить в операционную систему, и я подумал, что просто не знаю, как это сделать. По крайней мере, я бы ожидал информацию в «О».
el_gallo_azul