系统监控实用指南
在系统管理和运维中,监控系统的各项指标和进程是非常重要的。它可以帮助我们了解系统的运行状态,及时发现并解决潜在的问题。本文将介绍一些常用的系统监控命令和方法,包括计算命令执行时间、获取用户登录信息、找出最常用的命令、监控 CPU 使用率等。
1. 计算命令执行时间
在测试应用程序或比较不同算法时,程序的执行时间是一个关键指标。一个好的算法应该在最短的时间内执行完毕。在 UNIX 类操作系统中,可以使用
time
命令来计算命令的执行时间。
- 基本用法 :
$ time COMMAND
例如:
$ time ls
test.txt
next.txt
real 0m0.008s
user 0m0.001s
sys 0m0.003s
这里的
real
是实际经过的时间,包括其他进程使用的时间片和进程阻塞的时间;
user
是进程在用户模式代码中花费的 CPU 时间;
sys
是进程在内核中花费的 CPU 时间。
-
使用绝对路径 :
time命令有可执行二进制文件/usr/bin/time和 shell 内置命令两种形式。默认情况下,运行time会调用 shell 内置命令,但它的选项有限。因此,为了使用更多功能,建议使用绝对路径/usr/bin/time。 -
将时间统计信息写入文件 :
$ /usr/bin/time -o output.txt COMMAND
如果要追加时间统计信息而不覆盖文件,可以使用
-a
选项:
$ /usr/bin/time -a -o output.txt COMMAND
-
格式化时间输出
:
可以使用-f选项结合格式字符串来格式化时间输出。常用的格式字符串如下:
| 格式字符串 | 描述 |
| ---- | ---- |
|%e| 实际时间 |
|%U| 用户时间 |
|%S| 系统时间 |
例如:
$ /usr/bin/time -f "Time: %U" -a -o timing.log uname
Linux
当产生格式化输出时,命令的格式化输出会写入标准输出,被计时的命令的输出会写入标准错误。可以使用重定向运算符来重定向输出:
$ /usr/bin/time -f "Time: %U" uname > command_output.txt 2> time.log
$ cat time.log
Time: 0.00
$ cat command_output.txt
Linux
2. 获取用户登录信息
收集有关操作系统环境、登录用户、计算机开机时间和任何启动失败的信息非常有用。以下是一些常用的命令:
-
who和w命令 :-
who命令用于获取当前登录到机器的用户信息:
-
$ who
slynux pts/0 2010-09-29 05:24 (slynuxs-macbook-pro.local)
slynux tty7 2010-09-29 07:08 (:0)
- `w` 命令提供更详细的信息:
$ w
07:09:05 up 1:45, 2 users, load average: 0.12, 0.06, 0.02
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
slynux pts/0 slynuxs 05:24 0.00s 0.65s 0.11s sshd: slynux
slynux tty7 :0 07:08 1:45m 3.28s 0.26s gnome-session
TTY
是与文本终端关联的设备文件,可以使用
tty
命令查看当前终端的设备路径。
-
users命令 :
用于列出当前登录到机器的用户。如果用户打开了多个伪终端,会显示多个相同用户的条目。可以使用sort和uniq命令过滤出唯一的用户:
$ users
Slynux slynux slynux hacker
$ users | tr ' ' '\n' | sort | uniq
slynux
hacker
-
uptime命令 :
用于查看系统的开机时间和负载情况:
$ uptime
21:44:33 up 3:17, 8 users, load average: 0.09, 0.14, 0.09
up
后面的时间表示系统开机的时长。
-
last和lastb命令 :-
last命令用于获取以前的启动和用户登录会话信息:
-
$ last
slynux tty7 :0 Tue Sep 28 18:27 still logged in
reboot system boot 2.6.32-21-generi Tue Sep 28 18:10 - 21:46 (03:35)
slynux pts/0 :0.0 Tue Sep 28 05:31 - crash (12:39)
可以使用
-f
选项指定日志文件:
$ last -f /var/log/wtmp
还可以获取单个用户的登录会话信息:
$ last USER
获取重启会话信息:
$ last reboot
- `lastb` 命令用于获取失败的用户登录会话信息,需要以 root 用户身份运行:
# lastb
test tty8 :0 Wed Dec 15 03:56 - 03:56 (00:00)
slynux tty8 :0 Wed Dec 15 03:55 - 03:55 (00:00)
3. 找出最常用的 10 个命令
Bash 会将用户之前输入的命令记录在
~/.bash_history
文件中。可以通过以下脚本找出最常用的 10 个命令:
#!/bin/bash
#Filename: top10_commands.sh
#Description: Script to list top 10 used commands
printf "COMMAND\tCOUNT\n" ;
cat ~/.bash_history | awk '{ list[$1]++; } \
END{
for(i in list)
{
printf("%s\t%d\n",i,list[i]); }
}'| sort -nrk 2 | head
运行脚本:
$ ./top10_commands.sh
COMMAND COUNT
ping 80
ls 56
cat 35
ps 34
sudo 26
du 26
cd 26
ssh 22
sftp 22
clear 21
脚本的工作原理如下:
1. 从
~/.bash_history
文件中获取命令列表。
2. 使用
awk
命令统计每个命令的出现次数,将命令名作为数组索引,出现次数作为数组值。
3. 使用
sort -nrk 2
对结果按出现次数进行降序排序。
4. 使用
head
命令取前 10 个命令。
4. 监控一小时内 CPU 使用率最高的 10 个进程
在服务器环境中,CPU 是一个关键资源。可以使用以下脚本监控一小时内 CPU 使用率最高的 10 个进程:
#!/bin/bash
#Name: pcpu_usage.sh
#Description: Script to calculate cpu usage by processes for 1 hour
SECS=3600
UNIT_TIME=60
#Change the SECS to total seconds for which monitoring is to be
performed.
#UNIT_TIME is the interval in seconds between each sampling
STEPS=$(( $SECS / $UNIT_TIME ))
echo Watching CPU usage... ;
for((i=0;i<STEPS;i++))
do
ps -eo comm,pcpu | tail -n +2 >> /tmp/cpu_usage.$$
sleep $UNIT_TIME
done
echo
echo CPU eaters :
cat /tmp/cpu_usage.$$ | \
awk '
{ process[$1]+=$2; }
END{
for(i in process)
{
printf("%-20s %s",i, process[i]);
}
}' | sort -nrk 2 | head
rm /tmp/cpu_usage.$$
#Remove the temporary log file
运行脚本:
$ ./pcpu_usage.sh
Watching CPU usage...
CPU eaters :
Xorg 20
firefox-bin 15
bash 3
evince 2
pulseaudio 1.0
pcpu.sh 0.3
wpa_supplicant 0
wnck-applet 0
watchdog/0 0
usb-storage 0
脚本的工作原理如下:
1. 使用
ps -eo comm,pcpu
命令获取所有进程的命令名和 CPU 使用率。
2. 每 60 秒执行一次该命令,并将结果追加到
/tmp/cpu_usage.$$
文件中。
3. 一小时后,使用
awk
命令对每个进程的 CPU 使用率进行求和。
4. 使用
sort -nrk 2
对结果按 CPU 使用率进行降序排序。
5. 使用
head
命令取前 10 个进程。
5. 监控命令输出
在某些情况下,我们需要定期监控命令的输出。可以使用
watch
命令来实现这一功能。
- 基本用法 :
$ watch COMMAND
例如:
$ watch ls
或者:
$ watch 'COMMANDS'
例如:
$ watch 'ls -l | grep "^d"'
默认情况下,输出会每 2 秒更新一次。可以使用
-n
选项指定更新间隔:
$ watch -n 5 'ls -l'
-
高亮显示差异
:
使用-d选项可以高亮显示命令输出的差异:
$ watch -d 'COMMANDS'
6. 记录文件和目录访问
记录文件和目录的访问信息可以帮助我们跟踪文件和文件夹的变化。可以使用
inotifywait
命令来实现这一功能。不过,该命令不是所有 Linux 发行版都默认安装的,需要使用包管理器安装
inotify-tools
包,并且 Linux 内核需要编译支持
inotify
。
以下是一个监控目录访问的脚本:
#!/bin/bash
#Filename: watchdir.sh
#Description: Watch directory access
path=$1
#Provide path of directory or file as argument to script
inotifywait -m -r -e create,move,delete $path -q
运行脚本:
$ ./watchdir.sh .
./ CREATE new
./ MOVED_FROM new
./ MOVED_TO news
./ DELETE news
脚本的工作原理如下:
-
-m
选项用于持续监控变化,而不是在事件发生后退出。
-
-r
选项用于递归监控目录。
-
-e
选项指定要监控的事件列表。
-
-q
选项用于减少详细信息,只打印必要的信息。
可以将输出重定向到日志文件中,还可以根据需要添加或删除事件列表。
通过以上介绍的命令和方法,我们可以对系统进行全面的监控和管理,及时发现并解决系统中出现的问题,确保系统的稳定运行。
系统监控实用指南(续)
7.
time
命令更多参数及应用
除了前面介绍的基本用法,
time
命令还能通过格式字符串获取更多关于进程的详细信息。以下表格展示了一些有趣的参数及其描述:
| 参数 | 描述 |
| ---- | ---- |
|
%C
| 被计时命令的名称和命令行参数 |
|
%D
| 进程未共享数据区域的平均大小,以千字节为单位 |
|
%E
| 进程使用的实际(挂钟)时间,格式为 [小时:]分钟:秒 |
|
%x
| 命令的退出状态 |
|
%k
| 传递给进程的信号数量 |
|
%W
| 进程被换出主内存的次数 |
|
%Z
| 系统的页面大小,以字节为单位 |
|
%P
| 该作业占用 CPU 的百分比 |
|
%K
| 进程的平均总(数据 + 栈 + 文本)内存使用量,以千字节为单位 |
|
%w
| 程序自愿进行上下文切换的次数,例如等待 I/O 操作完成时 |
|
%c
| 进程非自愿进行上下文切换的次数(因为时间片到期) |
例如,使用
%Z
参数显示页面大小:
$ /usr/bin/time -f "Page size: %Z bytes" ls > /dev/null
Page size: 4096 bytes
这里将被计时命令的标准输出重定向到
/dev/null
设备,避免输出不必要的信息。更多格式字符串参数可通过
man time
查看详细内容。
8. 系统监控命令的综合应用案例
在实际的系统管理中,我们常常需要结合多个监控命令来全面了解系统状态。以下是几个综合应用案例:
案例一:持续监控系统负载和用户登录情况
我们可以编写一个脚本,每隔一段时间同时查看系统的负载情况和当前登录的用户信息,并将结果记录到日志文件中。
#!/bin/bash
LOG_FILE="system_monitor.log"
INTERVAL=300 # 每 5 分钟监控一次
while true
do
echo "--------------------- $(date) ---------------------" >> $LOG_FILE
uptime >> $LOG_FILE
who >> $LOG_FILE
sleep $INTERVAL
done
这个脚本会不断循环,每隔 5 分钟记录一次系统的负载和当前登录用户信息到
system_monitor.log
文件中。
案例二:监控特定进程的 CPU 使用率并在超过阈值时报警
假设我们要监控
firefox-bin
进程的 CPU 使用率,如果超过 80% 就发送报警邮件。
#!/bin/bash
THRESHOLD=80
PROCESS="firefox-bin"
while true
do
CPU_USAGE=$(ps -C $PROCESS -o pcpu= | tr -d ' ')
if [[ $CPU_USAGE > $THRESHOLD ]]; then
echo "$PROCESS CPU usage is over $THRESHOLD%! Current usage: $CPU_USAGE%" | mail -s "High CPU Alert" admin@example.com
fi
sleep 60 # 每分钟检查一次
done
这个脚本会每分钟检查一次
firefox-bin
进程的 CPU 使用率,如果超过 80% 就会向
admin@example.com
发送报警邮件。
9. 系统监控的工作流程
为了更好地进行系统监控,我们可以梳理出一个基本的工作流程,如下所示:
graph LR
A[确定监控目标] --> B[选择合适的监控命令]
B --> C[设置监控参数和时间间隔]
C --> D[执行监控命令并记录数据]
D --> E[分析监控数据]
E --> F{是否存在问题}
F -- 是 --> G[采取相应措施解决问题]
F -- 否 --> D
G --> D
这个流程图展示了系统监控的基本工作流程:
1. 确定需要监控的目标,如 CPU 使用率、用户登录情况等。
2. 根据监控目标选择合适的监控命令,如
time
、
ps
、
who
等。
3. 设置监控命令的参数和时间间隔,例如使用
watch
命令时指定更新间隔。
4. 执行监控命令并将数据记录下来,可以存储到文件中。
5. 对记录的数据进行分析,判断系统是否存在问题。
6. 如果存在问题,采取相应的措施解决问题,如优化进程、重启服务等。解决问题后继续进行监控。
10. 系统监控的注意事项
在进行系统监控时,还需要注意以下几点:
-
资源消耗
:频繁地执行监控命令可能会消耗一定的系统资源,特别是在监控高频率的情况下。因此,需要合理设置监控的时间间隔,避免对系统性能造成过大影响。
-
日志管理
:监控过程中会产生大量的日志数据,需要定期清理和管理日志文件,避免占用过多的磁盘空间。
-
权限问题
:某些监控命令需要特定的权限才能执行,如
lastb
命令需要以 root 用户身份运行。在使用这些命令时,要确保具有相应的权限。
-
异常处理
:在监控过程中,可能会遇到各种异常情况,如命令执行失败、网络连接中断等。需要在脚本中添加适当的异常处理机制,确保监控的稳定性。
通过遵循以上的方法和注意事项,我们可以更加高效、稳定地对系统进行监控和管理,保障系统的正常运行。同时,不断学习和掌握新的监控技巧和工具,能够进一步提升我们的系统管理能力。
超级会员免费看
5万+

被折叠的 条评论
为什么被折叠?



