Як визначити ім'я процесу програми?


13

Це ситуація:

Працюючи над (наступною версією) редактором швидкого списку Unity, я хотів би додати надійний спосіб "перезавантаження" піктограм запуску. Для цього мені потрібно видалити піктограму (редагування gsettings) і замінити її на ту саму позицію. Поки жодної проблеми. Однак, якщо програма, про яку йде мова, користувач, можливо, втратить дані, оскільки програма закриє, коли її значок буде знятий із запуску. Що мені потрібно - це надійний спосіб знайти ім'я процесу програми, щоб редактор перевірив список запущених процесів, якщо програма запущена, і надіслати повідомлення користувачеві про те, що піктограму неможливо перезапустити, якщо програма є біг.

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

Хоча метод, здається, добре працює з усіма програмами, на яких я його протестував, я вважаю, що повинен бути простіший спосіб вирішити проблему "все в один спосіб" ...

Є там?

Запрошуємо також запропонувати більше виняткових ситуацій!


Чому програма закриває програму, коли її значок видаляється з пускової програми? Вихід із програми, не закріпленої на панелі запуску, призводить до видалення її піктограми, але навіщо видалення піктограми закривати програму?
Елія Каган

@Eliah: Вихід, мабуть, не є правильним виразом, програма просто виходить з ладу ....
Яків Влійм

@JacobVlijm так, це єдність специфічна права? Єдність уже має механізм для цього. Які вимоги? Тільки знати ім'я процесу таке ж, як psі у xpropвихідному?
Сергій Колодяжний

@Serg Назва процесу, "обчислене" з .desktopфайлу, який не обов'язково є WM_CLASS. WM_CLASS можна встановити з програми.
Яків Влійм

@JacobVlijm ах, так, припустимо, ви почали firefox.desktop, він запускає firefox з PID 1234, але змінився WM_CLASSна щось на кшталт "Totally Not Firefox". Однак .desktopфайл не змінюється. Ви хочете, щоб ім’я додалося до PID 1234 незалежно від WM_CLASS. Я думаю, що я бачу саме те, що потрібно зробити. Але ти не відповів на моє перше запитання - чи гаразд, якщо це лише для Єдності?
Сергій Колодяжний

Відповіді:


3

Немає способу вирішити це в загальному випадку. Який би механізм ви не створили, я вважаю, що завжди можна буде написати процес, який ухилятиметься від вас, якщо ви не модифікуєте спосіб запуску процесів в першу чергу для того, щоб відстежувати їх таким чином.

Upstart повинен вирішити точно таку ж проблему, щоб відстежувати, якщо демони все ще запущені, і авторам завдань для запуску потрібно вказати реквізити (кількість вил) для того, щоб відстежувати нагору. Зважаючи на те, що початківці не можуть керувати нею без допомоги, я теж не думаю, що ви можете. А на початку навіть контролюється те, як запускаються процеси, і я не думаю, що ти тут.

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

Сказавши все це, я не переконаний, що вам справді потрібно це зробити в першу чергу. Якщо ви не можете відстежувати процес, то я не бачу, як і Unity міг би це зробити. Не був би кращим підходом у першу чергу усунути збої програми? Я хотів би розглянути деталі того, чому ваші додатки виходять з ладу (напевно, це десь помилка?), А не намагатися обійти його так, як ви описали. Цікаво, чи впливає це лише на програми, що знають Unity, які повертаються до Unity для отримання додаткової функціональності через DBus ?


Дякую за ретельну відповідь! Я вивчу деталі (особливо ваш останній абзац), і, ймовірно, запропоную функцію піктограми "перезапустити" як "експериментальну" опцію, якщо я не зможу знайти 100% сулютія. Хороша новина полягає в тому, що я тим часом не знайшов жодних винятків із використовуваного методу. Ще раз дякую!
Яків Влійм

1

xpropКоманда ( з подальшим Alt-Tab в відповідному вікні програми, а потім клацніть один раз у вікні) , здається, робить трюк для мене.


WM_CLASSчасто відповідає назві процесу, але, безумовно, не завжди. Визначаючи (кодуючи) вікно, я можу дати йому WM_CLASSвсе, що хочу. Навіть зробив це сам, щоб зробити вікна, запущені з різних процесів, об'єднати в одну піктограму запуску.
Яків Влійм

Ой. Це ганьба. Варто було моє додати застереження "... здається, зробить для мене трюк" наприкінці. Це функція, яку я дійсно очікував вбудувати в операційну систему, і я подумав, що просто не знаю, як це зробити. Принаймні, я б очікував інформації в "Про".
el_gallo_azul
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.