Это ситуация:
Работая над (следующей версией) редактора быстрого списка Unity, я хотел бы добавить надежный способ «перезапуска» значков запуска. Для этого мне нужно убрать значок (редактирование gsettings) и заменить его на ту же позицию. Пока проблем нет. Однако, если рассматриваемое приложение работает, пользователь, возможно, потеряет данные, так как приложение закроется, когда его значок будет удален из модуля запуска. Мне нужен надежный способ найти имя процесса приложения, позволить редактору проверить список запущенных процессов, если приложение запущено, и отправить пользователю предупреждение о том, что значок нельзя перезапустить, если приложение Бег.
Пока что я сделал, чтобы редактор просмотрел файл рабочего стола, прочитал команду, также прочитал команду, извлеченную из раздела каталога, и, кроме того, изучил возможные удаленные сценарии, на которые может указывать команда файла рабочего стола, ища строки, начинающиеся с с "./"
Хотя этот метод, кажется, хорошо работает со всеми приложениями, на которых я его тестировал, я чувствую, что должен быть более простой способ решения проблемы «все в одном» ...
Есть?
Также приветствуются предложения поймать более исключительные ситуации!
ps
иxprop
вывод?.desktop
файла, которое не обязательно является WM_CLASS. WM_CLASS может быть установлен из приложения.firefox.desktop
, он запускает Firefox с PID 1234, но изменилсяWM_CLASS
на что-то вроде «Полностью не Firefox»..desktop
Файл , однако , не меняется. Вы хотите получить имя, прикрепленное к PID 1234 независимо отWM_CLASS
. Я думаю, что я вижу, что именно нужно сделать. Но вы не ответили на мой первый вопрос - это нормально, если это только для Unity?Ответы:
Нет способа решить это в общем случае. Какой бы механизм вы ни придумали, я считаю, что всегда будет возможно написать процесс, который ускользнет от вас, если вы не измените способ запуска процессов в первую очередь, чтобы отслеживать их таким образом.
Upstart должен иметь дело с точно такой же проблемой, чтобы отследить, все ли еще работают демоны, и авторам заданий upstart нужно указать детали (количество вилок) для отслеживания upstart. Учитывая, что выскочка не может справиться с этим без помощи, я не думаю, что вы тоже можете. А выскочка даже контролирует способ запуска процессов, что, я думаю, вы не здесь.
Я думаю, что лучшее, что вы можете сделать, это то, что вы уже делаете. Глядя на это
/proc/<pid>/stat
и/proc/<pid>/cmdline
является достаточно общим способом, но все равно не уловить каждый случай. Командаpgrep
оборачивает это. Если вы еще не используетеpgrep
, взгляните на справочную страницу pgrep , чтобы найти варианты, с которыми вы можете сравнивать.Сказав все это, я не уверен, что вам действительно нужно делать это в первую очередь. Если вы не можете отследить процесс, тогда я не вижу, как Unity могла бы это сделать. Разве лучше не было бы устранить сбои приложения? Я хотел бы изучить детали того, почему ваши приложения аварийно завершают работу (наверняка, это где-то ошибка?), А не пытаться обойти это, как вы описали. Интересно, влияет ли это только на приложения с поддержкой Unity, которые обращаются к Unity для получения дополнительной функциональности через DBus ?
источник
Команда
xprop
(сопровождаемая alt-tab в соответствующем окне приложения, затем один раз щелкните в окне), кажется, помогает мне.источник
WM_CLASS
часто соответствует имени процесса, но определенно не всегда. Определяя (кодируя) окно, я могу дать ему любое,WM_CLASS
что захочу. Даже сам сделал, чтобы окна, запущенные из разных процессов, группировались в одну иконку запуска.