Jak określić nazwę procesu aplikacji?


13

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!


Dlaczego aplikacja ma zostać zamknięta, gdy jej ikona zostanie usunięta z programu uruchamiającego? Zamknięcie aplikacji, która nie jest przypięta do programu uruchamiającego, powoduje usunięcie jej ikony, ale dlaczego usunięcie ikony spowoduje zamknięcie aplikacji?
Eliah Kagan

@Eliah: rezygnacja jest prawdopodobnie niewłaściwym wyrażeniem, aplikacja po prostu ulega awarii ....
Jacob Vlijm

@JacobVlijm, więc to jest specyficzne dla Jedności, prawda? Unity ma już na to mechanizm. Jakie są wymagania? Czy tylko znać nazwę procesu taką samą jak w danych wyjściowych psi xprop?
Sergiy Kolodyazhnyy 10.10.16

@Serg Nazwa procesu „obliczona” z .desktoppliku, która niekoniecznie jest WM_CLASS. WM_CLASS można ustawić z poziomu aplikacji.
Jacob Vlijm,

@JacobVlijm ah, więc załóżmy firefox.desktop, że uruchamia WM_CLASSFirefoksa z PID 1234, ale zmienił się na coś w stylu „Totally Not Firefox”. .desktopPlik jednak nie zmienia. Chcesz, aby nazwa była dołączona do PID 1234 niezależnie od WM_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?
Sergiy Kolodyazhnyy 10.10.16

Odpowiedzi:


3

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>/stati /proc/<pid>/cmdlinejest to dość ogólny sposób, ale nadal nie złapie każdego przypadku. pgrepKomenda zawija to. Jeśli jeszcze nie używasz pgrep, 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 ?


Dziękujemy za dokładną odpowiedź! Przyjrzę się szczegółom (szczególnie twój ostatni akapit) i prawdopodobnie zaoferuję ikonę „restart” jako opcję „eksperymentalną”, jeśli nie mogę znaleźć 100% soulution. Dobra wiadomość jest taka, że ​​w międzyczasie nie znalazłem żadnych wyjątków od zastosowanej metody. Jeszcze raz dziękuję!
Jacob Vlijm

1

Wydaje mi się, że xproppolecenie (a następnie klawisz Alt do odpowiedniego okna aplikacji, a następnie kliknij raz w oknie)


WM_CLASSczęsto pasuje do nazwy procesu, ale zdecydowanie nie zawsze. Definiując (kodując) okno, mogę dać mu dowolne WM_CLASS. Nawet zrobiłem to, aby okna, uruchamiane z różnych procesów, grupować w jednej ikonie programu uruchamiającego.
Jacob Vlijm

O. Jaka szkoda. Warto dodać na końcu zastrzeżenie „... wydaje się, że załatwi sprawę”. Jest to funkcja, którą naprawdę spodziewałem się wbudować w system operacyjny i pomyślałem, że po prostu nie wiem, jak to zrobić. Przynajmniej spodziewałbym się informacji w „Informacje”.
el_gallo_azul
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.