Come posso determinare il nome del processo di un'applicazione?


13

Questa è la situazione:

Lavorando su (la prossima versione di) un editor Unity Quick List, vorrei aggiungere un modo affidabile per "riavviare" le icone di avvio. Per fare ciò, devo rimuovere l'icona (modifica delle impostazioni) e sostituirla nella stessa posizione. Finora nessun problema. Tuttavia, se l'applicazione in questione è in esecuzione, l'utente potrebbe perdere i dati, poiché l'applicazione verrà chiusa quando la sua icona viene rimossa dal programma di avvio. Ciò di cui ho bisogno è un modo affidabile per trovare il nome del processo di un'applicazione, per consentire all'editor di controllare l'elenco dei processi in esecuzione se l'applicazione è in esecuzione e inviare un messaggio di avviso all'utente che l'icona non può essere riavviata se l'applicazione è in esecuzione.

Quello che ho fatto finora è far esaminare l'editor nel file desktop, leggere il comando, leggere anche il comando, rimosso dalla sezione directory e inoltre esaminare eventuali script remoti a cui il comando del file desktop potrebbe fare riferimento, cercando stringhe che iniziano con "./"

Anche se il metodo sembra funzionare bene con tutte le applicazioni su cui l'ho testato, ho la sensazione che ci debba essere un modo più semplice per affrontare il problema in un modo "tutto in uno" ...

È lì?

Anche i suggerimenti per cogliere situazioni più eccezionali sono i benvenuti!


Perché un'applicazione dovrebbe uscire quando la sua icona viene rimossa dal programma di avvio? La chiusura di un'applicazione non fissata al programma di avvio comporta la rimozione della sua icona, ma perché la rimozione dell'icona dovrebbe uscire dall'applicazione?
Eliah Kagan,

@Eliah: smettere non è probabilmente l'espressione giusta, l'applicazione si blocca semplicemente ....
Jacob Vlijm

@JacobVlijm quindi, questo è specifico di Unity giusto? L'unità ha già un meccanismo per questo. Quali sono i requisiti? Solo per sapere il nome del processo come nell'output pse xprop?
Sergiy Kolodyazhnyy,

@Serg Il nome del processo, "calcolato" dal .desktopfile, che non è necessariamente WM_CLASS. WM_CLASS può essere impostato dall'interno dell'applicazione.
Jacob Vlijm,

@JacobVlijm ah, quindi supponiamo che tu abbia iniziato firefox.desktop, lancia Firefox con PID 1234, ma è cambiato WM_CLASSin qualcosa come "Totally Not Firefox". Il .desktopfile tuttavia non cambia. Si desidera ottenere il nome associato a PID 1234 indipendentemente da WM_CLASS. Penso di vedere esattamente cosa bisogna fare. Ma non hai risposto alla mia prima domanda: va bene se è solo per Unity?
Sergiy Kolodyazhnyy,

Risposte:


3

Non c'è modo di risolverlo nel caso generale. Qualunque meccanismo ti venga in mente, credo che sarà sempre possibile scrivere un processo che ti sfuggirà, a meno che tu non modifichi in primo luogo il modo in cui i processi vengono avviati per seguirli in quel modo.

Upstart deve affrontare esattamente lo stesso problema per monitorare se i daemon sono ancora in esecuzione e gli autori dei lavori in avvio devono specificare i dettagli (il numero di forchette) per essere monitorati. Dato che upstart non può gestirlo senza aiuto, non penso che nemmeno tu possa farlo. E upstart ha persino il controllo del modo in cui i processi vengono avviati, cosa che non credo tu sia qui.

Penso che il meglio che puoi fare sia quello che stai già facendo. Guardare /proc/<pid>/stated /proc/<pid>/cmdlineè un modo ragionevolmente generale, ma non riuscirà comunque a cogliere tutti i casi. Il pgrepcomando lo avvolge. Se non lo stai già utilizzando pgrep, dai un'occhiata alla manpage di pgrep per le opzioni su cui puoi confrontare.

Detto questo, non sono convinto che tu debba davvero farlo in primo luogo. Se non riesci a tracciare il processo, non vedo neanche come Unity possa farlo. Un approccio migliore non sarebbe quello di eliminare gli arresti anomali dell'applicazione in primo luogo? Vorrei esaminare i dettagli del motivo per cui le tue applicazioni si stanno arrestando in modo anomalo (sicuramente è un bug da qualche parte?), Piuttosto che cercare di aggirare il problema come hai descritto. Mi chiedo se ciò riguardi solo le applicazioni compatibili con Unity che richiamano Unity per funzionalità extra tramite DBus ?


Grazie per la tua risposta esauriente! Esaminerò i dettagli (in particolare il tuo ultimo paragrafo) e probabilmente offrirò l'icona "riavvia" come opzione "sperimentale" se non trovo un'anima al 100%. La buona notizia è che nel frattempo non ho trovato eccezioni sul metodo che ho usato. Grazie ancora!
Jacob Vlijm,

1

Il xpropcomando (seguito da alt-tab nella finestra dell'app pertinente, quindi fai clic una volta nella finestra) sembra fare il trucco per me.


WM_CLASSspesso corrisponde al nome del processo, ma sicuramente non sempre. Definendo (codificando) una finestra, posso dargli quello WM_CLASSche voglio. Ho anche fatto da solo per rendere le finestre, in esecuzione da processi diversi, raggruppate in un'unica icona di avvio.
Jacob Vlijm,

Oh. È un peccato. Valeva la pena aggiungere il disclaimer "... sembra fare il trucco per me" alla fine. È una funzione che mi aspettavo davvero fosse integrata nel sistema operativo e pensavo di non sapere come farlo. Per lo meno, mi aspetterei le informazioni in "Informazioni".
el_gallo_azul,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.