简介
Windows当中查看系统状态与进程可以在任务管理器当中查看,在Linux当中也有类似工具,但是相比起Windows,Linux相对分散,是由不同的文件显示不同的系统状态(当然Linux也有类似任务管理器的命令,不过最常使用的还是文件个),不过由于Linux是比较偏向于是专业人员的服务器系统,用文件调用功能也方便脚本的编写与调用
系统负载
查看系统当前时间、登录用户数、平均负载(1、5、15分钟内的平均进程数)
> uptime
以文件形式查看CPU信息,信息包含型号、核心数、频率、缓存等
> cat /proc/cpuinfo
以文件形式查看系统的平均负载信息,前三位是1、5、15分钟内的平均进程数,第四位的分子为正在运行的线程数,分母为总线程数,最后一位为最后运行的进程ID
> cat /proc/loadavg
注:正常来说每个CPU当前的活动进程(任务数)小于等于3代表系统的性能是良好的;如果每个CPU的任务数大于5则代表机器存在性能不足之类的严重问题。举个例子,假设系统有6个CPU,那么其每个CPU在1分钟内的进程数为:0.42/6=0.07,即当前每个CPU每分钟的任务数为0.07
Linux的监控命令,可以持续查看系统的运行线程与整体性能信息
> top
系统内存
查看系统内存信息(byte为单位显示)
> free
查看系统内存信息(MB为单位显示)
> free -m
以文件形式查看系统内存信息
> cat /proc/meminfo
系统进程
程序是指令、数据及其组织形式的描述,进程是运行程序的实例,是系统进行资源分配和调度的基本单位,是操作系统结构的基础,一个程序可以有多个进程
-
查看命令
1)ps
默认显示当前正在运行的进程的基本信息 > ps
| 参数 | 备注 |
|---|---|
| -a | 显示与现行终端相关的进程 |
| -u | 按照当前的用户ID或指定的用户名称来显示当前用户有效的进程,与U和--user效果相同 |
| -x | 显示所有进程状态,包含其他进程与非活的进程,通常配合-au进行使用。在本节第二点:常见进程状态当中会详细讲解 |
| -f | 完整显示输出,通过 \ 和 _ 来显示父进程与子进程的关系。标为 C 的列是由 CPU 用于计算执行优先级的因子;STIME 是指进程的启动时间; 问号表示这些进程不属于任何 TTY,因为它们是由系统启动的 |
| -e | 此参数的效果和指定"A"参数相同,例如: ps -e | grep sshd |
```bash
常用命令参数组合:
显示所有包含其他使用者进程的信息
> ps -aux
显示所有包含其他使用者进程的完整信息,更加清晰的表示子父进程的关系
> ps -auxf
```
```bash
返回系统中所有用户的所有进程的完整列表
> ps -ef
```
2)top
```bash
动态显示当前正在运行的进程的基本信息与系统内存、CPU等资源的使用情况
> top
```
| 操作 | 显示内容 |
|---|---|
| m | 切换内存数据的显示方式 |
| M | 按内存使用率排列进程 |
| P | 按处理器使用率排列进程 |
| h | 显示有关更多命令的帮助 |
| q | 退出 |
| 表头 | 描述 |
|---|---|
| USER | 进程所属用户 |
| PID | 进程的ID |
| PPID | 父进程的ID |
当两个进程是子父进程关系时,子进程属于父进程管理,若父进程比子进程先结束,会使子进程结束时不知道将资源归还给谁,这样会造成资源闲置但无法使用的现象,从而造成资源浪费,这种情况机器可使用的资源会越来越少,所以当编写程序时需要注意子父进程之间的关系。而这种情况下想释放被锁死的资源只能通过重启才能释放
- 常见进程状态
| 状态代码 | 备注 |
|---|---|
| R | 正在运行可中 |
| S | 处于休眠状态 |
| T | 停止或被追踪 |
| Z | 僵尸进程 |
| < | 优先级高的进程 |
| N | 优先级较低的进程 |
| L | 有些页被锁进内存 |
| s | 进程的领导者(在它之下有子进程) |
| l | 多线程进程(使用CLONE_THREAD,就像NPTL pthreads一样) |
| + | 位于前台的进程组 |
- 进程优先级
进程的优先级可以让系统优先分配有限的资源给更为重要的程序,就像是人工作时列出的工作清单,先做什么后做什么,下面将介绍两个修改修改程序优先级的命令,nice和renice
1)nice
nice命令可以修改进程的优先级,从而让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤其有用。 优先级值的取值范围是 -20到19 ,值越小优先级越高。Linux进程的默认优先级值为0。使用nice命令(不带任何参数时)可以将进程的优先级值设置为10。这样调度器就会将此进程视为较低优先级的进程,从而减少资源的分配
```bash
运行程序时使用nice命令调用程序
# nice -n 值 程序
> nice -n -20 matho-primes
```
2)renice
renice是nice的一个关联命令,它可以在运行时调整进程的 优先级值。使用 renice 命令时,要先找出进程的 PID,然后通过PID来进行修改优先级的操作
```bash
修改调整运行中的进程优先级
# renice 值 进程ID
> renice 0 4526
```
4. 前台作业与后台作业
| 名称 | 描述 |
|---|---|
| 前台 | 你可以控制的作业称为前台 |
| 后台 | 在内存中可以自动运行的作业,你无法控制,可用bg/fg调度到前台来 |
```bash
在运行程序时可在程序后加 & 把运行的程序放到后台
> sleep 1000 &
```
当把程序放到后台运行后要如何重新查看调用呢?这时候就需要用到 jobs命令来查看后台有什么处于程序,当程序进入后台后并不是不运行了,而是在后台运行,jobs会提示Running,当运行结束在下一次使用jobs时会提示Done,然后就会消失在jobs的列表当中
1)前台转后台
```bash
1.使用 Ctrl+z 暂停转到后台;
2.使用jobs命令查看进程编号;
3.使用bg % 1(假设1为进程在jobs当中的进程编号)让进程在后台启动继续运行。
```
2)后台转前台
```bash
1.使用jobs命令查看进程编号;
2.使用fg % 1(假设1为进程在jobs当中的进程编号)让进程从后台调到前台继续运行。
```
思考1:若sleep 1000 & 在运行过程中 ctrl+d 结束了终端连接,是否能停止该后台进程呢?不能的话要如何结束该后台进程呢?
在jobs当中是无法看到之前创建的后台进程了,但是在 ps -auxf 当中还是能看到休眠的 sleep 1000 & 进程
这个时候想要结束的话只能使用 kill 命令来杀死该进程了,或者重启系统
思考2:关闭终端是否影响到前后台运行的进程?使用 exit 和直接关闭这两种方式关闭会有何影响?
在思考1当中就已经其实已经很明显的显示,jobs显示的后台进程只是当前终端的后台进程,若通过exit、Ctrl+d或直接关闭终端,都会丢失jobs的进程数据。但不同的是exit和Ctrl+d断开终端连接与直接关闭终端的区别是,直接关闭终端后,输入 ps -aux | grep sleep 进行查看会发现正在运行的进程并没有发现直接关闭终端时测试的进程,例如:给出两个后台进程sleep 1000和sleep 1001,sleep 1001用于测试直接关闭终端的结果,如下图所示,直接关闭终端会导致后台进程sleep 1001直接在系统进程当中移除,而exit则会在系统进程当中保留下来。总的来分析,如果执行exit命令断开连接Linux会有相关的保存后台线程的机制,若强行关闭终端软件,则会造成后台进程终止运行。在实际应用当中建议先使用exit或Ctrl+d来断开终端连接再关闭终端软件
- 信号
进程使用称为信号的消息进行通信。进程随时都会接收信号(异步)。除信号编号(表示信号属于哪种类型)之外,信号不携带其他任何信息。
根据信号编号,进程能以不同方式处理信号:它可以退出、退出并转储内存副本、忽略信号或执行其他操作。大多数情况下,如果用户要向进程发送信号,就是要终止进程。系统事件可以向进程发送信号,用户也可以使用 kill 命令向进程发送任意信号。
1)top 和 kill 都可以用于向进程发送信号;
2)kill -l :显示定义的信号编号表;
3)kill -9 3254 :向PID为3254的进程发送编号为9的信号
4)常用的编号功能
| 编号 | 名称 | 功能 |
|---|---|---|
| 1 | HUP | 重新初始化后台程序 |
| 9 | KILL | 强制进程立即终止 |
| 15 | TERM | 请求在进程清理后终止进程(默认) |
5)进程的批量杀死
| 命令 | 操作 | 功能 |
|---|---|---|
| killall | killall 程序名 | 可以理解为 kill 命令的批量操作版本,根据程序名来结束相关进程 |
| pkill | pkill 程序名 | 与 killall 类似,都是通过程序名批量结束程序相关进程 |
| shell 脚本 | 编写 shell 脚本 | 通过kill PID来循环结束进程的运行 |
| xkill | 在Linux图形桌面下操作 | xkill 是Linux图形桌面下用于结束应用的,与Windows的任务管理器基本类似 |
系统日志
查看Linux系统日志可以使用下面三种方法:
- dmesg
dmesg会直接把所有日志信息直接显示在终端窗口当中,但是终端窗口显示的内容有限,所以对于查找以往日志并不友好,但却对查看最新日志相对来说比较方便
- /var/log/
/var/log/为Linux存放各种日志的位置,很多的软件默认的存放路径也是这个位置
- systemctl status [服务]
但这里只是部分日志或者简略版的日志,如果想要查看详细日志可以去 /var/log/ 当中查找相应的日志文件查看