Oto sytuacja:
Pracując nad (kolejną wersją) edytora Unity Quick List, chciałbym dodać niezawodny sposób „restartowania” ikon programu uruchamiającego. Aby to zrobić, muszę usunąć ikonę (edycję ustawień) i zastąpić ją w tej samej pozycji. Jak dotąd nie ma problemu. Jeśli jednak aplikacja jest uruchomiona, użytkownik prawdopodobnie utraci dane, ponieważ aplikacja zostanie zamknięta po usunięciu jej ikony z programu uruchamiającego. Potrzebuję niezawodnego sposobu na znalezienie nazwy procesu aplikacji, aby pozwolić edytorowi sprawdzić listę uruchomionych procesów, jeśli aplikacja jest uruchomiona, i wysłać użytkownikowi komunikat ostrzegawczy, że ikona nie może zostać ponownie uruchomiona, jeśli aplikacja jest bieganie.
Do tej pory sprawiłem, że edytor zajrzał do pliku pulpitu, przeczytał polecenie, przeczytał również polecenie, usunął go z sekcji katalogu, a ponadto zajrzał do możliwych skryptów zdalnych, do których może odwoływać się polecenie pliku pulpitu, szukając ciągów rozpoczynających się z "./"
Chociaż metoda wydaje się działać dobrze ze wszystkimi aplikacjami, na których ją testowałem, mam wrażenie, że musi istnieć łatwiejszy sposób na rozwiązanie problemu w sposób „wszystko w jednym” ...
Jest tu?
Mile widziane są również sugestie dotyczące złapania bardziej wyjątkowych sytuacji!
ps
ixprop
?.desktop
pliku, która niekoniecznie jest WM_CLASS. WM_CLASS można ustawić z poziomu aplikacji.firefox.desktop
, że uruchamiaWM_CLASS
Firefoksa z PID 1234, ale zmienił się na coś w stylu „Totally Not Firefox”..desktop
Plik jednak nie zmienia. Chcesz, aby nazwa była dołączona do PID 1234 niezależnie odWM_CLASS
. Myślę, że dokładnie widzę, co trzeba zrobić. Ale nie odpowiedziałeś na moje pierwsze pytanie - czy to w porządku, jeśli dotyczy tylko Unity?Odpowiedzi:
W ogólnym przypadku nie ma rozwiązania tego problemu. Bez względu na to, jaki wymyślisz mechanizm, wierzę, że zawsze będzie możliwe napisanie procesu, który będzie ci umykał, chyba że zmodyfikujesz sposób uruchamiania procesów w celu ich śledzenia.
Upstart musi rozwiązać dokładnie ten sam problem, aby śledzić, czy demony nadal działają, a autorzy zadań upstart muszą określić szczegóły (liczbę rozwidleń), aby upstart mógł śledzić. Biorąc pod uwagę, że upstart nie poradzi sobie bez pomocy, nie sądzę, że Ty też możesz. A upstart ma nawet kontrolę nad sposobem uruchamiania procesów, których nie sądzę, że tu jesteś.
Myślę, że najlepsze, co możesz zrobić, to to, co już robisz. Patrzenie na
/proc/<pid>/stat
i/proc/<pid>/cmdline
jest to dość ogólny sposób, ale nadal nie złapie każdego przypadku.pgrep
Komenda zawija to. Jeśli jeszcze nie używaszpgrep
, spójrz na stronę podręcznika pgrep, aby znaleźć opcje, z którymi możesz się równać.Powiedziawszy to wszystko, nie jestem przekonany, że naprawdę musisz to zrobić w pierwszej kolejności. Jeśli nie możesz śledzić tego procesu, nie widzę też, jak Unity może to zrobić. Czy nie byłoby lepszym rozwiązaniem, aby wyeliminować awarie aplikacji? Chciałbym przyjrzeć się szczegółom powodującym awarie aplikacji (z pewnością gdzieś to błąd?), Zamiast próbować obejść to, co opisałeś. Zastanawiam się, czy dotyczy to tylko aplikacji obsługujących Unity, które wzywają Unity w celu uzyskania dodatkowej funkcjonalności za pośrednictwem DBus ?
źródło
Wydaje mi się, że
xprop
polecenie (a następnie klawisz Alt do odpowiedniego okna aplikacji, a następnie kliknij raz w oknie)źródło
WM_CLASS
często pasuje do nazwy procesu, ale zdecydowanie nie zawsze. Definiując (kodując) okno, mogę dać mu dowolneWM_CLASS
. Nawet zrobiłem to, aby okna, uruchamiane z różnych procesów, grupować w jednej ikonie programu uruchamiającego.