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!
ps
undxprop
Ausgabe zu kennen?.desktop
Datei "berechnete" Prozessname, der nicht unbedingt die WM_CLASS ist. Die WM_CLASS kann in der Anwendung festgelegt werden.firefox.desktop
, Firefox mit PID 1234 zu starten , aber es wurdeWM_CLASS
in etwas wie "Totally Not Firefox" geändert . Die.desktop
Datei ändert sich jedoch nicht. Der Name soll unabhängig von der PID 1234 angehängt werdenWM_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?Antworten:
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>/stat
und/proc/<pid>/cmdline
ist eine einigermaßen allgemeine Methode, wird aber immer noch nicht jeden Fall erfassen. Derpgrep
Befehl bricht dies um. Wenn Sie es noch nicht verwendenpgrep
, 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 .
quelle
Der
xprop
Befehl (gefolgt von Alt-Tab zum entsprechenden App-Fenster und einem Klick in das Fenster) scheint den Trick für mich zu machen.quelle
WM_CLASS
stimmt oft mit dem Prozessnamen überein, aber definitiv nicht immer. Wenn ich ein Fenster definiere (codiere), kann ich es beliebig weitergebenWM_CLASS
. Ich habe es sogar selbst geschafft, Fenster, die von verschiedenen Prozessen ausgeführt werden, in einem Startsymbol zu gruppieren.