Wie spanne ich das ganze System?

1923
Vi.

Mit strace können Sie die Aktivität eines bestimmten Programms überwachen. Wie kann ich die Aktivität aller Programme überwachen (erwarten Sie für sshd / bash / strace_itself)?

Momentan verwende ich einen Hack wie diesen:

function ppid() { cat /proc/"$1"/status | grep PPid: | grep -o "[0-9]*"; }; function pidtree() { P=$1; while [ "$P" != "1" ]; do echo $P; P=`ppid $P`; done; echo 1; }; strace -fe execve `( pgrep ''; pidtree $$ ) | sort | uniq -u | sed 's/^/-p /'` 

Hinweis: Wenn Sie dies verwenden, kann Ihr System einfrieren.

Gibt es einen besseren Weg, dies zu tun?

3

2 Antworten auf die Frage

1
Horn OK Please

It's not very feasible to "strace the whole system" from userspace. As I indicated in the previous question you asked, the best way is to use a kernel-mode tracing infrastructure such as kprobes, systemtap, or dtrace. Have you looked at any of these? Is there a reason why none of them will work for your use case?

The only way to truly reliably strace the entire system from userspace would be to start your trace with the init process... but I'm not sure that init or systemd would be very happy with you stracing it, since it does a lot of very low-level stuff that's pretty fragile and easy to break (and hard to inject wrapper commands around it too, I might add).

This is why the highest quality probing mechanisms have some type of kernel module, because the kernel "sees all". This is especially relevant since you are trying to monitor activity on character devices such as /dev/console and /dev/tty*, and the kernel has direct oversight over the calls to those devices since they are implemented in kernelspace.

Der Ansatz des Kernel-Moduls ist nicht praktisch, wenn Sie einfach SSH in ein Remote-System einbauen und die Überwachung starten möchten. Vi. vor 11 Jahren 0
Wenn Sie sich mit einem Remote-System verbinden, um die Systemaufrufe oder libc-Aufrufe aller Prozesse auf dem System anzuzeigen, muss ich davon ausgehen, dass Sie über Root-Zugriff verfügen, oder? Denn ohne root können Sie jetzt genauso gut aufgeben, denn es gibt keinen Weg (außerhalb einer Sicherheitsanfälligkeit), um Prozesse zu verfolgen, die Ihr Benutzer nicht besitzt, wenn Sie nicht root sind. Und root kann Kernel-Module laden, also ......... Horn OK Please vor 11 Jahren 0
Ja, als root, um festzustellen, welcher Prozess versucht, eine Datei zu öffnen. Die Lösung muss nicht für Produktionsserver geeignet sein, sondern nur als Entwicklungs- oder persönliches Nutzungswerkzeug. Vi. vor 11 Jahren 0
1
fche

Der einfachste Weg mit systemtap ist so etwas wie:

stap -e 'probe nd_syscall.* { println(execname(), pid(), " ", pn(), argstr) }' 

(@Vi, es ist keine manuelle Arbeit des Kernel-Moduls erforderlich; systemtap erledigt dies für sich selbst. Sie benötigen jedoch Kernel-Modul-Entwicklungsdateien.)

Das Format des Stapels unterscheidet sich stark von der Form. "-e execve" ist nur zum Beispiel. Ich brauche Zeitstempel, geöffnete Dateien, Sockets und andere Dinge. Vi. vor 11 Jahren 0
Versuchte dies: `semantischer Fehler: ungelöste Arity-0-Funktion: Bezeichner 'pn' at : 1: 54 " Vi. vor 11 Jahren 0
Vi., Versuchen Sie pp () anstelle von pn (), wenn Ihre Kopie von Stap älter als Release 1.3 (vor zwei Jahren) ist. Sie können das Ausgabeformat mit printf ("...") steuern, Zeitstempel hinzufügen usw. Ich glaube, jemand hat ein ungefähres Stap-Skript im Strace-Format geschrieben. fche vor 11 Jahren 0
Jetzt wird "error:" CLONE_STOPPED "hier nicht deklariert" und andere C-Fehler angezeigt. Es ist in der Regel etwas zerbrechlicher und ich erwarte nicht, dass es auf verschiedenen Systemen sofort funktioniert. Vi. vor 11 Jahren 0
(Vi., Bitte senden Sie uns einen Problembericht an unsere Mailingliste, .) fche vor 11 Jahren 0