Wie bestimme ich den Prozessnamen einer Anwendung?

13

Das ist die Situation:

Ich arbeite an (der nächsten Version von) einem Unity Quick List-Editor und möchte eine zuverlässige Methode zum "Neustarten" von Starter-Symbolen hinzufügen. Dazu muss ich das Symbol entfernen (gsettings bearbeiten) und an derselben Position ersetzen. Bisher kein Problem. Wenn die betreffende Anwendung jedoch ausgeführt wird, gehen möglicherweise Daten verloren, da die Anwendung beendet wird, wenn das entsprechende Symbol aus dem Launcher entfernt wird. Was ich brauche, ist eine zuverlässige Möglichkeit, den Prozessnamen einer Anwendung zu finden, den Editor die Liste der ausgeführten Prozesse überprüfen zu lassen, wenn die Anwendung ausgeführt wird, und dem Benutzer eine Warnmeldung zu senden, dass das Symbol nicht neu gestartet werden kann, wenn die Anwendung ausgeführt wird Laufen.

Bisher habe ich den Editor dazu gebracht, in die Desktop-Datei zu schauen, den Befehl zu lesen, auch den Befehl zu lesen, aus dem Verzeichnisabschnitt zu streichen und darüber hinaus nach möglichen Remote-Skripten zu suchen, auf die der Desktop-Dateibefehl möglicherweise verweist mit "./"

Obwohl die Methode mit allen Anwendungen, mit denen ich sie getestet habe, gut zu funktionieren scheint, habe ich das Gefühl, dass es einen einfacheren Weg geben muss, um das Problem auf eine Art und Weise zu lösen ...

Gibt es?

Auch Vorschläge, um weitere Ausnahmesituationen einzufangen, sind willkommen!

Jacob Vlijm
quelle
Warum wird eine Anwendung beendet, wenn das Symbol aus dem Launcher entfernt wird? Wenn Sie eine Anwendung beenden, die nicht an den Launcher angeheftet ist, wird das zugehörige Symbol entfernt. Warum wird die Anwendung jedoch beendet, wenn Sie das Symbol entfernen?
Eliah Kagan
@Eliah: Beenden ist wahrscheinlich nicht der richtige Ausdruck, die Anwendung stürzt einfach ab ....
Jacob Vlijm
@JacobVlijm also, das ist Unity-spezifisch, oder? Die Einheit hat bereits einen Mechanismus dafür. Was sind die Anforderungen? Nur um den gleichen Prozessnamen wie in der psund xpropAusgabe zu kennen?
Sergiy Kolodyazhnyy
@Serg Der aus der .desktopDatei "berechnete" Prozessname, der nicht unbedingt die WM_CLASS ist. Die WM_CLASS kann in der Anwendung festgelegt werden.
Jacob Vlijm
@JacobVlijm ah, nehmen wir an, Sie haben damit begonnen firefox.desktop, Firefox mit PID 1234 zu starten , aber es wurde WM_CLASSin etwas wie "Totally Not Firefox" geändert . Die .desktopDatei ändert sich jedoch nicht. Der Name soll unabhängig von der PID 1234 angehängt werden WM_CLASS. Ich denke, ich sehe genau, was getan werden muss. Aber Sie haben meine erste Frage nicht beantwortet - ist es in Ordnung, wenn es nur für Unity ist?
Sergiy Kolodyazhnyy

Antworten:

3

Es gibt keine Möglichkeit, dies im allgemeinen Fall zu lösen. Welchen Mechanismus Sie auch entwickeln, ich glaube, dass es immer möglich sein wird, einen Prozess zu schreiben, der sich Ihnen entziehen wird, es sei denn, Sie ändern die Art und Weise, wie Prozesse überhaupt gestartet werden, um sie auf diese Weise zu verfolgen.

Upstart muss sich mit genau demselben Problem befassen, um zu verfolgen, ob noch Daemons ausgeführt werden, und die Autoren von Upstart-Jobs müssen Details (die Anzahl der Gabeln) angeben, damit Upstart nachverfolgt werden kann. Da Emporkömmling es nicht ohne Hilfe schaffen kann, denke ich, dass Sie es auch nicht können. Und Emporkömmling kontrolliert sogar die Art und Weise, wie Prozesse gestartet werden, was ich nicht glaube, dass Sie hier sind.

Ich denke, das Beste, was Sie tun können, ist das, was Sie bereits tun. Betrachten /proc/<pid>/statund /proc/<pid>/cmdlineist eine einigermaßen allgemeine Methode, wird aber immer noch nicht jeden Fall erfassen. Der pgrepBefehl bricht dies um. Wenn Sie es noch nicht verwenden pgrep, sehen Sie in der pgrep-Manpage nach, mit welchen Optionen Sie übereinstimmen können.

Trotzdem bin ich nicht davon überzeugt, dass Sie dies wirklich tun müssen. Wenn Sie den Prozess nicht verfolgen können, sehe ich auch nicht, wie Unity dies tun könnte. Wäre es nicht besser, die Abstürze der Anwendung zu beseitigen? Ich würde genauer untersuchen, warum Ihre Anwendungen abstürzen (das ist sicher irgendwo ein Fehler?), Anstatt zu versuchen, es wie beschrieben zu umgehen. Ich frage mich, ob dies nur Unity- fähige Anwendungen betrifft, die für zusätzliche Funktionen über DBus zu Unity zurückrufen .

Robie Basak
quelle
Vielen Dank für Ihre gründliche Antwort! Ich werde auf die Details eingehen (insbesondere auf Ihren letzten Absatz) und wahrscheinlich das Symbol "Neustart" als "experimentelle" Option anbieten, wenn ich keine 100% ige Soulution finde. Die gute Nachricht ist, dass ich in der Zwischenzeit keine Ausnahmen bei der von mir verwendeten Methode gefunden habe. Noch einmal vielen Dank!
Jacob Vlijm
1

Der xpropBefehl (gefolgt von Alt-Tab zum entsprechenden App-Fenster und einem Klick in das Fenster) scheint den Trick für mich zu machen.

el_gallo_azul
quelle
WM_CLASSstimmt oft mit dem Prozessnamen überein, aber definitiv nicht immer. Wenn ich ein Fenster definiere (codiere), kann ich es beliebig weitergeben WM_CLASS. Ich habe es sogar selbst geschafft, Fenster, die von verschiedenen Prozessen ausgeführt werden, in einem Startsymbol zu gruppieren.
Jacob Vlijm
Oh. Das ist eine Schande. Es hat sich gelohnt, den Haftungsausschluss "... scheint den Trick für mich zu tun" am Ende hinzuzufügen. Es ist eine Funktion, von der ich wirklich erwartet hatte, dass sie in das Betriebssystem eingebaut wird, und ich dachte, dass ich einfach nicht wusste, wie man das macht. Zumindest würde ich die Informationen in "Über" erwarten.
el_gallo_azul