Vor langer Zeit in der UNIX-Geschichte waren Benutzer auf einem Server echte UNIX-Benutzer mit Einträgen in /etc/shadow
und eine interaktive Login-Shell und ein Home-Verzeichnis. Es gab Tools für Administratoren, um mit Benutzern zu kommunizieren und ihre Aktivitäten zu überwachen, um dumme oder böswillige Fehler zu vermeiden, die dazu führen würden, dass Serverressourcen unfair zugewiesen werden.
Heutzutage hat Ihre Benutzerbasis wahrscheinlich weniger Einträge in /etc/shadow
, sondern von einer Abstraktionsebene verwaltet werden, sei es LDAP, Drupal oder OpenShift. Andererseits gibt es jetzt viel mehr Server, was bedeutet, dass sich viel mehr Systemadministratoren an- und abmelden, um Wartungsarbeiten durchzuführen. Wo Aktivität ist, gibt es Möglichkeiten für Fehler und Verwirrung, also ist es an der Zeit, diese alten Überwachungstools abzustauben und sie sinnvoll zu nutzen.
Hier sind einige der Überwachungsbefehle, die Sie vielleicht vergessen haben (oder von denen Sie nichts wussten), mit denen Sie verfolgen können, was auf Ihrem Server passiert.
wer
Zuerst die Grundlagen.
Der who
Der Befehl wird vom GNU-Coreutils-Paket bereitgestellt und seine Hauptaufgabe besteht darin, /var/log/utmp
zu parsen einreichen und die Ergebnisse melden.
Der utmp
Datei protokolliert die aktuellen Benutzer auf dem System. Es zeigt nicht unbedingt jeden Prozess, da nicht alle Programme utmp
starten Protokollierung. Tatsächlich hat Ihr System möglicherweise nicht einmal einen utmp
Datei standardmäßig. In diesem Fall who
greift auf /var/log/wtmp
zurück , das alle An- und Abmeldungen aufzeichnet.
Der wtmp
Dateiformat ist genau dasselbe wie utmp
, außer dass ein Null-Benutzername eine Abmeldung anzeigt und der ~
Zeichen zeigt das Herunterfahren oder Neustarten des Systems an. Der wtmp
Datei wird von login(1)
verwaltet , init(1)
, und einige Versionen von getty(8)
, jedoch erstellt keine dieser Anwendungen die Datei, also wenn Sie wtmp
entfernen , dann ist die Protokollierung deaktiviert. Allein das ist gut zu wissen:Wenn wtmp
fehlt, sollten Sie herausfinden, warum!
Die Ausgabe von who --heading
sieht in etwa so aus:
NAME LINE TIME COMMENT
seth tty2 2020-01-26 18:19 (tty2)
larry pts/2 2020-01-28 13:02 (10.1.1.8)
curly pts/3 2020-01-28 14:42 (10.1.1.5)
Dies zeigt Ihnen den Benutzernamen jeder angemeldeten Person, den Zeitpunkt, zu dem ihr Login aufgezeichnet wurde, und ihre IP-Adresse.
Der who
Der Befehl bietet auch demütigerweise die offizielle POSIX-Methode, um herauszufinden, welcher Benutzer Sie ist eingeloggt sind als, aber nur wenn utmp
existiert:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8)
Es bietet auch einen Mechanismus zum Anzeigen des aktuellen Runlevels:
$ who -r
run-level 5 2020-01-26 23:58
w
Für etwas mehr Kontext über Benutzer, das einfache w
Der Befehl bietet eine Liste, wer angemeldet ist und was er tut. Diese Informationen werden in einem ähnlichen Format wie die Ausgabe von who
angezeigt , sondern die Zeit, die der Benutzer im Leerlauf war, die CPU-Zeit, die von allen Prozessen verwendet wird, die mit dem Anmelde-TTY verbunden sind, und die CPU-Zeit, die nur vom aktuellen Prozess verwendet wird. Der aktuelle Prozess des Benutzers wird im letzten Feld aufgelistet.
Beispielausgabe:
$ w
13:45:48 up 29 days, 19:24, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:22m 0.01s 0.01s /usr/libexec/gnome-session-binary
curly pts/2 13:02 35:12 0.03s 0.03s -bash
Alternativ können Sie mit dem -i
die IP-Adresse des Nutzers einsehen oder --ip-addr
Option.
Sie können die Ausgabe auf einen einzelnen Benutzernamen einschränken, indem Sie angeben, über welchen Benutzer Sie Informationen wünschen:
$ w seth
13:45:48 up 29 days, 19:27, 2 users, load average: 0.53, 0.52, 0.54
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
seth tty2 Sun18 43:25m 0.01s 0.01s /usr/libexec/gnome-session-binary
utmpdump
Der utmpdump
Das Dienstprogramm macht (fast) genau das, was sein Name vermuten lässt:Es gibt den Inhalt von /var/log/utmp
aus Datei auf Ihren Bildschirm. Tatsächlich gibt es beides aus das utmp
oder das wtmp
Datei, je nachdem, welche Sie angeben. Die angegebene Datei muss sich natürlich nicht in /var/log
befinden oder sogar utmp
genannt oder wtmp
, und es muss nicht einmal das richtige Format haben. Wenn Sie utmpdump
füttern eine Textdatei, es gibt den Inhalt auf Ihrem Bildschirm aus (oder eine Datei mit dem --output
Option) in einem Format, das vorhersehbar und einfach zu analysieren ist.
Normalerweise würden Sie natürlich einfach who
verwenden oder w
um Anmeldedatensätze zu analysieren, aber utmpdump
ist in vielen Fällen nützlich.
- Dateien können beschädigt werden. Während
who
undw
sind oft in der Lage, Beschädigungen selbst zu erkennen,utmpdump
ist immer toleranter, weil es kein eigenes Parsing durchführt. Es rendert die Rohdaten für Sie. - Sobald Sie eine beschädigte Datei repariert haben,
utmpdump
können Ihre Änderungen wieder einfügen. - Manchmal möchten Sie Daten einfach selbst parsen. Vielleicht suchen Sie etwas, das
who
undw
sind nicht darauf programmiert, danach zu suchen, oder vielleicht versuchen Sie, ganz eigene Korrelationen herzustellen.
Was auch immer der Grund ist, utmpdump
ist ein nützliches Werkzeug, um Rohdaten aus den Anmeldedatensätzen zu extrahieren.
Wenn Sie ein beschädigtes Anmeldeprotokoll repariert haben, können Sie utmpdump
verwenden um Ihre Änderungen in das Hauptprotokoll zurückzuschreiben:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp
ps
Sobald Sie wissen, wer bei Ihrem System angemeldet ist, können Sie ps
verwenden um eine Momentaufnahme der aktuellen Prozesse zu erhalten. Dies ist nicht mit der Oberseite zu verwechseln, die einen laufenden Bericht über aktuelle Prozesse anzeigt; Dies ist ein Schnappschuss, der in dem Moment aufgenommen wurde ps
ausgestellt und dann auf Ihrem Bildschirm ausgedruckt. Beide haben Vor- und Nachteile, sodass Sie je nach Ihren Anforderungen auswählen können, welche Sie verwenden möchten. Aufgrund seiner statischen Natur ist ps
ist besonders nützlich für die spätere Analyse oder einfach nur als schöne überschaubare Zusammenfassung.
Das ps
Der Befehl ist alt und bekannt, und es scheint, dass viele Administratoren eher den alten UNIX-Befehl als die neueste Implementierung gelernt haben. Das moderne ps
(aus dem procps-ng
Paket) bietet viele hilfreiche Mnemonics, und es ist das, was auf RHEL, CentOS, Fedora und vielen anderen Distributionen ausgeliefert wird, also wird es in diesem Artikel verwendet.
Mit --user
können Sie erreichen, dass alle Prozesse von einem einzigen Benutzer ausgeführt werden (oder -u
) zusammen mit dem Benutzernamen, über den Sie einen Bericht erstellen möchten. Um der Ausgabe den hinzugefügten Kontext zu geben, welcher Prozess der Elternprozess eines Kindprozesses ist, verwenden Sie --forest
Option für eine „Baum“-Ansicht:
$ ps --forst --user larry
PID TTY TIME CMD
39707 ? 00:00:00 sshd
39713 pts/4 00:00:00 \_ bash
39684 ? 00:00:00 systemd
39691 ? 00:00:00 \_ (sd-pam)
Für jeden Prozess auf dem System:
$ ps --forest -e
[...]
29284 ? 00:00:48 \_ gnome-terminal-
29423 pts/0 00:00:00 | \_ bash
42767 pts/0 00:00:00 | | \_ ps
39631 pts/1 00:00:00 | \_ bash
39671 pts/1 00:00:00 | \_ ssh
32604 ? 00:00:00 \_ bwrap
32612 ? 00:00:00 | \_ bwrap
32613 ? 00:09:05 | \_ dring
32609 ? 00:00:00 \_ bwrap
32610 ? 00:00:15 \_ xdg-dbus-proxy
1870 ? 00:00:05 gnome-keyring-d
4809 ? 00:00:00 \_ ssh-agent
[...]
Die Standardspalten sind nützlich, aber Sie können sie ändern, um sie besser an Ihre Recherche anzupassen. Das -o
Option gibt Ihnen die volle Kontrolle darüber, welche Spalten Sie sehen. Eine vollständige Liste möglicher Spalten finden Sie unter Standardformatbezeichner Abschnitt von ps(1) Manpage.
$ ps -eo pid,user,pcpu,args --sort user
42799 root 0.0 [kworker/u16:7-flush-253:1]
42829 root 0.0 [kworker/0:2-events]
42985 root 0.0 [kworker/3:0-events_freezable_power_]
1181 rtkit 0.0 /usr/libexec/rtkit-daemon
1849 seth 0.0 /usr/lib/systemd/systemd --user
1857 seth 0.0 (sd-pam)
1870 seth 0.0 /usr/bin/gnome-keyring-daemon --daemonize --login
1879 seth 0.0 /usr/libexec/gdm-wayland-session /usr/bin/gnome-session
Das ps
Befehl ist sehr flexibel. Sie können die Ausgabe nativ ändern, sodass Sie sich nicht auf grep
verlassen müssen und awk
um zu finden, was Ihnen wichtig ist. Erstelle einen guten ps
Befehl, benennen Sie es mit etwas Merkwürdigem und führen Sie es oft aus. Dies ist eine der besten Möglichkeiten, um darüber informiert zu bleiben, was auf Ihrem Server passiert.
pgrep
Manchmal haben Sie möglicherweise eine Vorstellung von einem problematischen Prozess und müssen ihn anstelle Ihrer Benutzer oder Ihres Systems untersuchen. Dafür gibt es den pgrep
Befehl aus dem psproc-ng
Paket.
Im einfachsten Fall pgrep
funktioniert wie ein grep auf der Ausgabe von ps
:
$ pgrep bash
29423
39631
39713
Anstatt die PIDs aufzulisten, können Sie einfach zählen, wie viele PIDs zurückgegeben würden:
$ pgrep --count bash
3
Für weitere Informationen können Sie Ihre Suche durch Prozesse nach Benutzernamen beeinflussen (-u
), Terminal (--terminal
) und Alter (--newest
und --oldest
), und mehr. So finden Sie beispielsweise einen Prozess, der einem bestimmten Benutzer gehört:
$ pgrep bash -u moe --list-name
39631 bash
Sie können sogar inverse Übereinstimmungen mit --inverse
erhalten Option.
pkill
Verwandt mit pgrep
ist das pkill
Befehl. Es ist dem kill
sehr ähnlich Befehl, außer dass es die gleichen Optionen wie pgrep
verwendet So können Sie mit den Informationen, die für Sie am einfachsten sind, Signale an einen problematischen Prozess senden.
Zum Beispiel, wenn Sie festgestellt haben, dass ein Prozess, der von Benutzer larry
initiiert wurde monopolisiert Ressourcen, und Sie wissen von w
dieser larry
befindet sich am Terminal pts/2
, dann können Sie die Anmeldesitzung und alle ihre untergeordneten Elemente mit nur dem Terminalnamen beenden:
$ sudo pkill -9 --terminal pts/2
Oder Sie können nur den Benutzernamen verwenden, um alle passenden Prozesse zu beenden:
$ sudo pkill -u larry
Mit Bedacht verwendet, pkill
ist eine gute „Panik“-Taste oder Lösung im Stil eines Vorschlaghammers, wenn ein Problem außer Kontrolle gerät.
Terminalüberwachung
Nur weil eine Reihe von Befehlen in einem Terminal vorhanden sind, heißt das nicht, dass sie unbedingt besser sind als andere Lösungen. Machen Sie eine Bestandsaufnahme Ihrer Anforderungen und wählen Sie das beste Werkzeug für Ihre Anforderungen aus. Manchmal ist ein grafisches Überwachungs- und Berichtssystem genau das, was Sie brauchen, und manchmal sind Terminalbefehle, die einfach per Skript erstellt und geparst werden können, die richtige Antwort. Wählen Sie weise, lernen Sie Ihre Tools kennen, und Sie werden nie im Dunkeln darüber sein, was in Ihrem Bare Metal passiert.
[Möchten Sie mehr über Überwachung und Sicherheit erfahren? Sehen Sie sich die Checkliste für IT-Sicherheit und Compliance an. ]