Před dlouhou dobou v historii UNIXu byli uživatelé na serveru skutečnými uživateli UNIX se záznamy v /etc/shadow a interaktivní přihlašovací shell a domovský adresář. Existovaly nástroje pro administrátory, jak komunikovat s uživateli a sledovat jejich aktivitu, aby se předešlo hloupým nebo zlomyslným chybám, které by způsobily nespravedlivé přidělování zdrojů serveru.
V dnešní době je méně pravděpodobné, že vaše uživatelská základna bude mít záznamy v /etc/shadow , místo toho je spravováno vrstvou abstrakce, ať už je to LDAP nebo Drupal nebo OpenShift. Na druhou stranu je nyní mnohem více serverů, což znamená, že se mnohem více systémových administrátorů přihlašuje a odhlašuje za účelem údržby. Kde je aktivita, tam je příležitost k chybám a zmatkům, takže je čas oprášit staré monitorovací nástroje a dobře je využít.
Zde jsou některé z monitorovacích příkazů, na které jste možná zapomněli (nebo jste o nich nikdy nevěděli), které vám pomohou sledovat, co se děje na vašem serveru.
kdo
Nejprve základy.
who příkaz je poskytován balíčkem GNU coreutils a jeho primárním úkolem je analyzovat /var/log/utmp založit a ohlásit svá zjištění.
utmp soubor zaznamenává aktuální uživatele v systému. Nemusí nutně zobrazovat každý proces, protože ne všechny programy spouštějí utmp protokolování. Ve skutečnosti váš systém nemusí mít ani utmp soubor ve výchozím nastavení. V takovém případě who padne zpět na /var/log/wtmp , který zaznamenává všechna přihlášení a odhlášení.
wtmp formát souboru je přesně stejný jako utmp , kromě toho, že prázdné uživatelské jméno označuje odhlášení a ~ znak označuje vypnutí nebo restart systému. wtmp soubor je spravován login(1) , init(1) a některé verze getty(8) žádná z těchto aplikací však nevytvoří soubor, takže pokud odstraníte wtmp , pak je uchovávání záznamů deaktivováno. Už jen to je dobré vědět:if wtmp chybí, měli byste zjistit proč!
Výstup who --heading vypadá asi takto:
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) Zobrazí se vám uživatelské jméno každé přihlášené osoby, čas zaznamenání jejich přihlášení a jejich IP adresa.
who příkaz také pokorně poskytuje oficiální způsob POSIX, jak zjistit, který uživatel vy jsou přihlášeni jako, ale pouze pokud utmp existuje:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8) Poskytuje také mechanismus pro zobrazení aktuální úrovně běhu:
$ who -r
run-level 5 2020-01-26 23:58 w
Pro trochu více kontextu o uživatelích, jednoduché w poskytuje seznam přihlášených a co dělá. Tyto informace jsou zobrazeny ve formátu podobném výstupu who , ale doba, po kterou byl uživatel nečinný, čas procesoru používaný všemi procesy připojenými k přihlašovacímu TTY a čas procesoru používaný pouze aktuálním procesem. Aktuální proces uživatele je uveden v posledním poli.
Ukázkový výstup:
$ 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
Případně můžete zobrazit IP adresu uživatele pomocí -i nebo --ip-addr možnost.
Výstup můžete zúžit na jediné uživatelské jméno zadáním, o kterém uživateli chcete informace:
$ 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
utmpdump nástroj dělá (téměř) přesně to, co jeho název napovídá:vypisuje obsah souboru /var/log/utmp soubor na vaši obrazovku. Ve skutečnosti se vypíše buď utmp nebo wtmp soubor, podle toho, který zadáte. Soubor, který určíte, se samozřejmě nemusí nacházet v /var/log nebo dokonce s názvem utmp nebo wtmp a ani to nemusí být ve správném formátu. Pokud používáte zdroj utmpdump textový soubor, vypíše obsah na vaši obrazovku (nebo soubor s --output option) ve formátu, který je předvídatelný a snadno analyzovatelný.
Normálně byste samozřejmě použili pouze who nebo w analyzovat přihlašovací záznamy, ale utmpdump je užitečné v mnoha případech.
- Soubory mohou být poškozeny. Zatímco
whoawjsou často schopni odhalit korupci sami,utmpdumpje stále tolerantnější, protože sám o sobě neprovádí žádnou analýzu. Vykreslí nezpracovaná data, se kterými se můžete vypořádat. - Jakmile opravíte poškozený soubor,
utmpdumpmůže opravit vaše změny zpět. - Někdy prostě chcete data analyzovat sami. Možná hledáte něco, co
whoawnejsou naprogramováni tak, aby hledali, nebo se možná snažíte vytvořit korelace podle sebe.
Ať je důvod jakýkoli, utmpdump je užitečný nástroj pro extrakci nezpracovaných dat z přihlašovacích záznamů.
Pokud jste opravili poškozený log přihlášení, můžete použít utmpdump zapsat změny zpět do hlavního protokolu:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp ps
Jakmile budete vědět, kdo je přihlášen do vašeho systému, můžete použít ps získat přehled o aktuálních procesech. Toto nelze zaměňovat s horní částí, která zobrazuje běžící zprávu o aktuálních procesech; toto je snímek pořízený v okamžiku ps je vydán a poté vytištěn na vaši obrazovku. Oba mají své výhody a nevýhody, takže si můžete vybrat, který použijete na základě svých požadavků. Kvůli své statické povaze ps je zvláště užitečné pro pozdější analýzu nebo jen jako pěkné přehledné shrnutí.
ps příkaz je starý a dobře známý a zdá se, že mnoho správců se naučilo starý příkaz UNIX spíše než nejnovější implementaci. Moderní ps (z procps-ng balíček) nabízí mnoho užitečných mnemotechnických pomůcek a právě to se dodává na RHEL, CentOS, Fedora a mnoha dalších distribucích, takže to je to, co tento článek používá.
Všechny procesy můžete spustit jedním uživatelem pomocí --user (nebo -u ) spolu s uživatelským jménem, o kterém chcete zprávu. Chcete-li dát výstupu přidaný kontext, jehož proces je rodičem podřízeného procesu, použijte --forest možnost „stromového“ zobrazení:
$ 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) Pro každý proces v systému:
$ 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
[...]
Výchozí sloupce jsou užitečné, ale můžete je změnit, aby lépe vyhovovaly tomu, co zkoumáte. -o Tato možnost vám dává plnou kontrolu nad tím, které sloupce vidíte. Úplný seznam možných sloupců naleznete v části Standardní specifikace formátu části ps(1) manuálová stránka.
$ 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
ps příkaz je velmi flexibilní. Jeho výstup můžete nativně upravit, takže se nemusíte spoléhat na grep a awk abyste našli to, co vás zajímá. Vytvořte dobrý ps příkaz, alias to něco zapamatovatelného, a spustit to často. Je to jeden z nejlepších způsobů, jak zůstat informováni o tom, co se děje na vašem serveru.
pgrep
Někdy můžete mít nějakou představu o problematickém procesu a potřebujete jej prozkoumat namísto vašich uživatelů nebo systému. Chcete-li to provést, existuje pgrep příkaz z psproc-ng balíček.
Ve své nejzákladnější podobě pgrep funguje jako grep na výstupu ps :
$ pgrep bash
29423
39631
39713 Místo vypisování PID můžete získat pouze počet PID, které by se vrátilo:
$ pgrep --count bash
3
Chcete-li získat další informace, můžete vyhledávání v procesech ovlivnit podle uživatelského jména (-u ), terminál (--terminal ) a věk (--newest a --oldest ), a více. Chcete-li najít proces patřící konkrétnímu uživateli, například:
$ pgrep bash -u moe --list-name
39631 bash
Můžete dokonce získat inverzní shody s --inverse možnost.
pkill
Souvisí s pgrep je pkill příkaz. Je to hodně jako kill příkaz, kromě toho, že používá stejné možnosti jako pgrep takže můžete posílat signály do problematického procesu pomocí jakýchkoli informací, které jsou pro vás nejjednodušší.
Pokud jste například zjistili, že proces spustil uživatel larry monopolizuje zdroje a znáte to z w ten larry je umístěn na terminálu pts/2 , pak můžete ukončit přihlašovací relaci a všechny její potomky pouze pomocí názvu terminálu:
$ sudo pkill -9 --terminal pts/2 Nebo můžete použít pouze uživatelské jméno k ukončení všech procesů, které mu vyhovují:
$ sudo pkill -u larry
Používá se uvážlivě, pkill je dobré „panikové“ tlačítko nebo řešení ve stylu perlíku, když se problém vymkne kontrole.
Monitorování terminálu
To, že v terminálu existuje řada příkazů, neznamená, že jsou nutně lepší než jiná řešení. Udělejte si inventuru svých požadavků a vyberte si ten nejlepší nástroj pro to, co potřebujete. Někdy je grafický monitorovací a reportovací systém přesně to, co potřebujete, a jindy jsou správnou odpovědí terminálové příkazy, které lze snadno skriptovat a analyzovat. Vybírejte moudře, naučte se své nástroje a nikdy nebudete mít jasno v tom, co se děje ve vašem holém kovu.
[Chcete se dozvědět více o monitorování a zabezpečení? Podívejte se na kontrolní seznam zabezpečení IT a dodržování předpisů. ]