Wie erkennt man das Starten von Programmen unter Linux?
Lesezeit: 10 Minuten
Kern
Ich habe einen einfachen Daemon geschrieben. Dieser Daemon sollte reagieren, wenn ich ein beliebiges Programm ausführe. Wie macht man das? In einer großen Daemon-Schleife:
while(1)
{
/* function which catches new programm running */
}
Welche Funktionen müssen in Linux aufgerufen werden, wenn ich ein neues Programm ausführe (neuen Prozess erstellen)?
Ich denke, wir werden ein wenig mehr Informationen brauchen
– Adam Batkin
20. Mai 2011 um 16:40 Uhr
@Adam Batkin – Ich bin anderer Meinung, die Frage ist ausreichend gestellt, der Poster möchte über die Prozesserstellung informiert werden
– Chris Stratton
20. Mai 2011 um 16:42 Uhr
Startet dieser Daemon Firefox oder wird Firefox extern vom Benutzer gestartet und Sie möchten benachrichtigt werden? Ihre Frage könnte eine kleine Klarstellung gebrauchen.
– Justin Dearing
20. Mai 2011 um 16:44 Uhr
@Chris: Das ist sicherlich eine gültige Interpretation. Sie können die Frage gerne bearbeiten, um dies klarer zu machen
Für Linux scheint es eine Schnittstelle im Kernel zu geben. Bei der Untersuchung dieses Problems bin ich auf Leute gestoßen, die die Kernelkonfiguration CONFIG_CONNECTOR und CONFIG_PROC_EVENTS verwenden, um Ereignisse beim Prozesstod zu erhalten.
Der Proc-Anschluss und die Sockelfilter Gesendet am 9. Februar 2011 von Scott
Der Proc-Konnektor ist eines dieser interessanten Kernel-Features, auf das die meisten Leute selten stoßen und noch seltener eine Dokumentation darüber finden. Ebenso der Steckdosenfilter. Das ist eine Schande, denn beide sind wirklich sehr nützliche Schnittstellen, die einer Vielzahl von Zwecken dienen könnten, wenn sie besser dokumentiert wären.
Der Proc-Connector ermöglicht es Ihnen, Benachrichtigungen über Prozessereignisse wie Fork- und Exec-Aufrufe sowie über Änderungen an der UID, GID oder SID (Sitzungs-ID) eines Prozesses zu erhalten. Diese werden über eine Socket-basierte Schnittstelle bereitgestellt, indem Instanzen von struct proc_event gelesen werden, die im Kernel-Header definiert sind….
Das ist wunderschön, ich dachte schon, ich müsste in den Kernel-Code eintauchen …
– notbad.jpeg
19. Januar 2016 um 17:20 Uhr
Beachten Sie, dass Sie bei Bedarf die PID von erzeugten Prozessen verwenden können, um zusätzliche Prozessinformationen aus dem /proc/-Verzeichnis zu lesen. Ich habe dies verwendet, um Befehlszeileninformationen zu extrahieren, um auch den Namen eines Prozesses bei der Erstellung anzuzeigen.
– h0r53
20. Juni 2018 um 16:04 Uhr
Chris Stratton
Ich war daran interessiert, herauszufinden, wie man dies ohne Abfrage macht. inotify() scheint nicht auf /proc zu funktionieren, also ist diese Idee raus.
Jedes dynamisch verknüpfte Programm greift jedoch beim Start auf bestimmte Dateien zu, z. B. den dynamischen Linker. Dies wäre aus Sicherheitsgründen nutzlos, da es bei einem statisch verknüpften Programm nicht ausgelöst wird, aber dennoch von Interesse sein könnte:
Die von diesem Ausdruck ausgegebenen Ereignisse enthalten keine interessanten Informationen – die PID des auslösenden Prozesses scheint von inotify nicht bereitgestellt zu werden. Es könnte jedoch verwendet werden, um aufzuwachen und einen erneuten Scan von /proc auszulösen
Beachten Sie auch, dass kurzlebige Programme wieder verschwinden können, bevor dieses Ding aufwacht und das Scannen von /proc beendet – vermutlich würden Sie erfahren, dass sie existiert haben, aber nicht in der Lage sein, zu erfahren, was sie waren. Und natürlich könnte jeder einfach einen fd zum dynamischen Linker öffnen und schließen, um Sie im Rauschen zu ertränken.
Tobu
Verwenden forkstates ist der vollständigste Client für proc-Ereignisse:
Das Makefile benötigt eine kleine Änderung (LDLIBS Anstatt von LDFLAGS).
cn_proc und exec-notify.c (die Arnaud gepostet hat) haben einen gemeinsamen Vorfahren; cn_proc verarbeitet ein paar Ereignisse mehr und hat eine sauberere Ausgabe, ist aber nicht belastbar, wenn Prozesse schnell beendet werden.
Ooh, ich habe einen weiteren Fork von exec-notify gefunden, extrahieren. Dieser rückt untergeordnete Prozesse unterhalb ihres übergeordneten Prozesses ein (unter Verwendung einer pid_depth-Heuristik).
Debian- und Ubuntu-apt-Pakete: forkstat und extrace. Übrigens: Aus irgendeinem Grund funktionieren beide Tools nicht in meiner WSL2-basierten Ubuntu 20.04 LTSwerden sie nicht über die Prozesserstellung benachrichtigt.
– Abdul
9. Januar um 20:18 Uhr
Arnaud Meuret
Schau mal rein dieses kleine Programm von Sebastian Krahmer macht es genau das, was Sie verlangen, auf ressourceneffiziente Weise und mit ziemlich einfachem Code.
Es erfordert, dass Ihr Kernel CONFIG_PROC_EVENTS aktiviert hat, was beispielsweise beim neuesten Amazon Linux Image (2012.09) nicht der Fall ist.
UPDATE: Nach a Anfrage an Amazon die Amazon Linux Image-Kernel unterstützen jetzt PROC_EVENTS
Das Stichwort für die Suchmaschine Ihrer Wahl lautet „Process Event Connector“.
Ich mag die letzteren mehr, aber beide machen ihre Arbeit sehr gut.
Ich weiß nicht, ob es einen besseren Weg gibt, aber Sie könnten die regelmäßig scannen /proc Dateisystem.
Zum Beispiel, /proc/<pid>/exe ist ein symbolischer Link zur ausführbaren Datei des Prozesses.
Auf meinen Systemen (Ubuntu/RedHat) /proc/loadavg enthält die Anzahl der laufenden Prozesse (die Zahl nach dem Schrägstrich) sowie die PID des zuletzt gestarteten Prozesses. Wenn Ihr Daemon die Datei abfragt, wird ihm jede Änderung an einer der beiden Zahlen mitteilen, wann er erneut scannen muss /proc auf der Suche nach neuen Prozessen.
Das ist keineswegs kugelsicher, aber der geeignetste Mechanismus, der mir einfällt.
Sie können entweder das Betriebssystem nach Programmen durchsuchen, die Ihrem Kriterium entsprechen, oder Sie können warten, bis sich ein Programm an Ihren Daemon meldet. Welche Technik Sie wählen, hängt stark davon ab, wie viel Kontrolle Sie über Ihre Nicht-Daemon-Programme haben.
Das Scannen kann durch einen Kernel-Systemaufruf oder durch Lesen der vom Benutzerbereich angekündigten Kernel-Details (wie beim /proc-Dateisystem) durchgeführt werden. Beachten Sie, dass das Scannen keine Garantie dafür ist, dass Sie ein bestimmtes Programm finden, denn wenn das Programm es schafft, zwischen den Scanzyklen zu starten und zu beenden, wird es überhaupt nicht erkannt.
Kompliziertere Techniken der Prozesserfassung sind möglich, aber sie erfordern auch kompliziertere Implementierungen. Es ist wichtig zu wissen, was wirklich benötigt wird, bevor Sie nach exotischen Lösungen suchen (Einfügen von Kernel-Treibern usw.), da alles, was Sie tun, nicht unabhängig von dem System ist, das Sie überwachen. Sie ändern die Umgebung tatsächlich, indem Sie sie beobachten, und einige Methoden, die Umgebung zu beobachten, können sie auf unangemessene Weise verändern.
13665200cookie-checkWie erkennt man das Starten von Programmen unter Linux?yes
Ich denke, wir werden ein wenig mehr Informationen brauchen
– Adam Batkin
20. Mai 2011 um 16:40 Uhr
@Adam Batkin – Ich bin anderer Meinung, die Frage ist ausreichend gestellt, der Poster möchte über die Prozesserstellung informiert werden
– Chris Stratton
20. Mai 2011 um 16:42 Uhr
Startet dieser Daemon Firefox oder wird Firefox extern vom Benutzer gestartet und Sie möchten benachrichtigt werden? Ihre Frage könnte eine kleine Klarstellung gebrauchen.
– Justin Dearing
20. Mai 2011 um 16:44 Uhr
@Chris: Das ist sicherlich eine gültige Interpretation. Sie können die Frage gerne bearbeiten, um dies klarer zu machen
– Adam Batkin
20. Mai 2011 um 16:44 Uhr
Das Audit-Daemon kann Protokollieren Sie die ausgeführten Programme durch Verfolgen der
execve
Systemaufruf. Vielleicht kannst du dich davon inspirieren lassen.– Cristian Ciupitu
20. Mai 2011 um 21:30 Uhr