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
who
aw
jsou často schopni odhalit korupci sami,utmpdump
je 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,
utmpdump
může opravit vaše změny zpět. - Někdy prostě chcete data analyzovat sami. Možná hledáte něco, co
who
aw
nejsou 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ů. ]