2017-06-25 6 views
1

ausgelöst wird. Ich führe ein OSX-Werkzeug, das den Elternbaum eines ausgewählten Prozesses vom direkten Elternteil zum frühesten Vorfahren (normalerweise lanciert) enthüllt.Den "echten" Elternprozeß erhalten, wenn der Prozeß indirekt über launchd

Diese Prozesskette kann jedoch beschädigt werden, wenn der untersuchte Prozess indirekt durch Ereignisse wie das Doppelklicken auf das Bundle-Symbol oder durch Ausführen des Prozesses von bash mit dem Befehl open gestartet wurde. In diesen Fällen würde ich gerne entweder bash oder finder sehen.

Vielleicht ist XPC Messaging Layer die Antwort, da ich davon ausgehe, dass diese Ereignisse durch diesen Mechanismus zu launchd übergeben werden. Andere verfügbare OSX-Frameworks sind jedoch immer willkommen.

EDIT:

Ich verstehe, dass, wenn ein Prozess selbst löst beim Laufen konnte ich es ppid nicht wiederherstellen, aber mein Ziel ist es, die Anrufer zu verfolgen, die Prozesserstellung initiieren.

danke

+0

Nicht ganz sicher, was Sie suchen, aber wenn ein Prozess selbst ablöst, hat es 1 (init) als direkte Mutter pid .... –

+0

Ich verstehe, dass ich konnte nicht nicht die Zeit verlieren, wenn sich ein Prozess in der Mitte des Lebens löst. Aber vielleicht gibt es eine Möglichkeit, den Prozess Anrufer zu verfolgen, während es nur aus Doppelklick-Ereignis hervorgebracht wird, durch die Verfolgung der Kommunikation zwischen Finder und launchd – Zohar81

Antwort

0

Was Sie sehen, ist das richtige Verhalten. Wenn ein Benutzer ein Anwendungspaket im Finder öffnet oder den Befehl open im Terminal verwendet, ist Launch Services für die Ausführung der Anwendung verantwortlich.

Wenn eine Anwendung in OS X/macOS eingeführt wird, wird sie bei den Launch Services entsprechend ihrer Bundle-ID registriert, wie in der Datei Info.plist des Bundles deklariert.

Wenn der Benutzer im Terminal doppelklickt oder open im Terminal verwendet, empfängt Launch Services die Bundle-ID und startet die Anwendung, die zuvor registriert wurde.

Es sollte beachtet werden, dass Probleme auftreten können, wenn die Kennung eines Anwendungspakets nicht eindeutig ist. Mit zwei App-Bundles, die die gleiche Versions- und Anwendungs-ID haben, führt Launch Services die erste Anwendung aus, die es registriert hat, aber es ist möglicherweise nicht die, die der Benutzer denkt, dass sie ausgeführt wird!

Im Gegensatz dazu, wenn Sie das Terminal verwenden, um die Binärdatei direkt innerhalb eines Anwendungspakets ohne die Verwendung von open auszuführen, wird das übergeordnete Element die von Terminal verwendete Shell-Anwendung sein. Zum Beispiel: -

/Applications/Calculator.app/Contents/MacOS/Calculator 
+0

Hallo und vielen Dank für die Beantwortung meiner Frage. Ich weiß, dass es das richtige Verhalten ist, aber ich frage mich, ob es eine Möglichkeit gibt, die Entität zurückzuverfolgen, die die Prozesserstellung initiiert hat, sei es ein "Finder" -Doppelklick-Ereignis oder ein "Öffnen" -Befehl. – Zohar81

+0

Vom Benutzermodus, nein. Wenn Sie wirklich entschlossen sind, erwarte ich, dass Sie es mit einer Kernel-Erweiterung tun können, aber das ist weit jenseits einer Antwort auf eine SO-Frage. – TheDarkKnight

+0

Ich bin bereit, ein Kext wenn nötig zu schreiben, aber ich dachte, dass die Nachricht zu launchd nicht durch den Kernel geht, es sei denn xpc ist durch die Mach-Nachrichten .. vielleicht können Sie mir nur einige allgemeine Richtlinien für den Anfang geben ? Vielen Dank – Zohar81

Verwandte Themen