很久以前,在UNIX历史中,服务器上的用户是实际的UNIX用户,其中包含条目,/etc/shadow交互式登录外壳和主目录。管理员可以使用一些工具与用户进行交流,并监视他们的活动,以避免可能导致服务器资源被不公平分配的愚蠢或恶意错误。
如今,您的用户群不太可能在中拥有条目/etc/shadow,而由LDAP,Drupal或OpenShift等抽象层进行管理。再说一遍,现在有更多的服务器,这意味着有更多的系统管理员登录和注销以执行维护。哪里有活动,哪里就有犯错和混乱的机会,所以现在该清理那些旧的监视工具并加以利用了。
以下是一些您可能忘记(或从未听说过)的监视命令,以帮助您跟踪服务器上正在发生的事情。
WHO
首先,基础知识。
该who命令由GNU coreutils包提供,其主要工作是解析/var/log/utmp文件并报告其发现。
该utmp文件记录系统上的当前用户。它不一定显示每个进程,因为不是所有程序都启动utmp日志记录。实际上,utmp默认情况下,您的系统甚至可能没有文件。在这种情况下,who回退到/var/log/wtmp,它将记录所有登录和注销。
该wtmp文件格式是完全一样的utmp,只是一个空的用户名指示注销和~字符表示系统关机或重启。该wtmp文件由login(1),init(1)和维护getty(8),但是某些版本的,这些应用程序均未创建该文件,因此,如果删除wtmp,则记录保持功能将被停用。知道这一点是很高兴的:如果wtmp丢失了,您应该找出原因!
的输出who --heading看起来像这样:
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)
这将向您显示每个登录用户的用户名,登录时间和IP地址。
该who命令还虚心地提供了正式的POSIX方法来发现您以哪个用户身份登录,但前提是utmp存在该用户:
$ who -m
curly pts/3 2020-01-28 14:44 (10.1.1.8)
它还提供了一种显示当前运行级别的机制:
$ who -r
run-level 5 2020-01-26 23:58
w
有关用户的更多信息,简单的w命令提供了登录者及其正在执行的操作的列表。该信息的显示格式类似于的输出who,但是用户空闲的时间,登录到TTY的所有进程所使用的CPU时间以及仅当前进程所使用的CPU时间。用户的当前过程列在最后一个字段中。
样本输出:
$ 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
或者,您可以使用-i或--ip-addr选项查看用户的IP地址。
您可以通过指定所需的用户信息来将输出范围缩小到单个用户名:
$ 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实用程序(几乎)确实如其名称所示:将/var/log/utmp文件内容转储到屏幕上。事实上,它转储无论是在utmp或wtmp文件,这取决于您指定。当然,您指定的文件不必位于,/var/log甚至不必命名为utmp或wtmp,并且甚至不必具有正确的格式。如果utmpdump输入文本文件,它将以--output可预测且易于解析的格式将内容转储到屏幕(或带有选项的文件)中。
当然,通常,通常只使用who或w解析登录记录,但utmpdump在许多情况下很有用。
- 文件可能会损坏。尽管who并且w通常能够自己检测到腐败,但是utmpdump由于它本身不会进行解析,因此容忍度越来越高。它将呈现原始数据供您处理。
- 修复损坏的文件后,utmpdump可以修补您的更改。
- 有时您只想自己解析数据。也许您正在寻找某些东西,who而w这些东西并未经过编程即可寻找,或者您正试图自己建立关联。
无论出于何种原因,它utmpdump都是从登录记录中提取原始数据的有用工具。
如果您修复了损坏的登录日志,则可以使用utmpdump将更改写回到主日志中:
$ sudo utmpdump -r < wtmp.fix > /var/log/wtmp
ps
一旦知道谁在系统上登录,就可以使用它ps来获取当前进程的快照。不要将它与top混淆,top显示当前进程的运行报告;这是ps发布后拍摄的快照,然后打印到屏幕上。两者都有优点和缺点,因此您可以根据需要选择使用哪种。由于其静态性质,ps对于以后的分析或作为一个很好的可管理的摘要特别有用。
该ps命令是古老的,众所周知的,似乎许多管理员已经学会了旧的UNIX命令,而不是最新的实现。现代的ps(来自procps-ng软件包)提供了许多有用的助记符,这是RHEL,CentOS,Fedora和许多其他发行版上附带的,因此本文将使用它。
您可以使用--user(或-u)选项让单个用户运行所有进程,以及您想要报告的用户名。要为输出提供哪个进程是子进程的父进程的附加上下文,请使用--forest“树”视图选项:
$ 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)
对于系统上的每个进程:
$ 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
[...]
默认列很有用,但是您可以更改它们以更好地适应您正在研究的内容。该-o选项使您可以完全控制看到的列。有关可能的列的完整列表,请参考ps(1)手册页的“标准格式说明符”部分。
$ 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命令非常灵活。您可以本地修改其输出,因此您不必依赖grep并awk找到您关心的内容。制定一个好的ps命令,将其作为难忘的别名,然后经常运行。这是随时了解服务器上正在发生的事情的最佳方法之一。
pgrep
有时,您可能对有问题的过程有所了解,需要进行调查而不是用户或系统。为此,请pgrep从psproc-ng包中获取命令。
最基本的说,它pgrep像grep的输出ps:
$ pgrep bash
29423
39631
39713
无需列出PID,您只需获取将返回多少PID的计数即可:
$ pgrep --count bash
3
有关更多信息,您可以通过用户名(-u),终端(--terminal)和年龄(--newest和--oldest)等来影响搜索过程。查找属于特定用户的进程,例如:
$ pgrep bash -u moe --list-name
39631 bash
您甚至可以使用--inverse选项获得逆向匹配。
pkill
与pgrep该pkill命令相关。它与kill命令非常相似,不同之处在于它使用的选项相同,pgrep因此您可以使用最适合您的信息将信号发送到麻烦的过程。
例如,如果你已经发现,通过用户启动了一个进程larry独占资源,你知道从w那个larry位于终端pts/2,则可以中止登录会话及其所有的孩子只用终端名称:
$ sudo pkill -9 --terminal pts/2
或者,您可以仅使用用户名结束与之匹配的所有进程:
$ sudo pkill -u larry
pkill当问题失控时,明智地使用它是一个很好的“应急”按钮或大锤式解决方案。
终端监控
仅仅因为终端中存在一系列命令并不意味着它们一定比其他解决方案要好。盘点您的需求,并根据需要选择最佳工具。有时候,图形监控和报告系统正是您所需要的,而有时,易于编写脚本和解析的终端命令才是正确的答案。明智地选择,学习您的工具,您将永远不会对裸机中发生的事情有所了解。