20、系统监控实用指南

系统监控实用指南

在系统管理和运维中,监控系统的各项指标和进程是非常重要的。它可以帮助我们了解系统的运行状态,及时发现并解决潜在的问题。本文将介绍一些常用的系统监控命令和方法,包括计算命令执行时间、获取用户登录信息、找出最常用的命令、监控 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 用户身份运行。在使用这些命令时,要确保具有相应的权限。
- 异常处理 :在监控过程中,可能会遇到各种异常情况,如命令执行失败、网络连接中断等。需要在脚本中添加适当的异常处理机制,确保监控的稳定性。

通过遵循以上的方法和注意事项,我们可以更加高效、稳定地对系统进行监控和管理,保障系统的正常运行。同时,不断学习和掌握新的监控技巧和工具,能够进一步提升我们的系统管理能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值