一.学习的内容
本次主要学了Linux一些常用的系统工作命令,如echo、date、timedatectl、reboot、poweroff、wget、ps、pstree、top、nice、pidof、kill、killall等命令。
1.echo命令
echo命令用于在终端设备上输出字符串或变量提取后的值。
命令格式为:echo [字符串][$变量]
如图1-1所示,在命令行输入:“echo i love linux” 后,按“回车键”执行该条命令,运行结果如下所示。
![](https://i-blog.csdnimg.cn/blog_migrate/b31c4687badcdac7dafae15b0d0da967.png)
如图1-2所示,在命令行输入 “echo $SHELL”后,执行该条语句,运行结果如下所示。
![](https://i-blog.csdnimg.cn/blog_migrate/801350e4fc3b7e6041482a7b5e7833d5.png)
在命令行输入“echo i love $SHELL”并执行后,会产生如图1-3所示的输出。
![](https://i-blog.csdnimg.cn/blog_migrate/3a3f4fa29efe6d09dbf3b643e84b5fa6.png)
echo命令后的参数部分也可以用双引号括起来(建议都用双引号括起来),如图1-4所示。可以看到,由于我在双引号的开头敲了个空格,所以在输出时也有空格。除此之外,它和图1-3的输出是一样的,
![](https://i-blog.csdnimg.cn/blog_migrate/e3c050f7fdc50af4d69992c27903cc30.png)
2.date命令
date命令主要是用来查看系统的日期和时间。命令格式:date [+指定格式]
参数 | 作用 |
---|---|
%S | 秒0-59 |
%M | 分0-59 |
%H | 时0-23 |
%I | 时0-12 |
%m | 月1-12 |
%p | am/pm |
%a | 工作日的英文缩写(Sun) |
%A | 工作日的完整英文(Sunday) |
%b | 月份的英文缩写(Jan) |
%B | 月份的英文全写(January) |
%y | 年的简写(如2024简写24) |
%Y | 年的全写 |
%d | 本月月中的第几天 |
%j | 本年中的第几天 |
%n | 换行 |
%t | 一个tab位 |
%q | 输出第几季度 |
按照默认格式查看当前系统时间的date命令如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/503b5efeb5ebe3f280c4bf930415888b.png)
按照“年-月-日 时:分:秒 周几 今年的第几天”的格式查看系统时间的date命令如下:
其中,%Y表示完整年份,%H表示24小时制,%A表示完整工作日。
![](https://i-blog.csdnimg.cn/blog_migrate/e18538407bd5afbe2a33bc38edbefbdc.png)
同样的,也按照上述格式(不过把Y换成y,H换成I,A换成a,再加上%p、%n、%t ),查看系统时间的命令和输入如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/11c408342e695cb674ea706292708fd8.png)
查看当前的月份和季度的命令如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/02d8d737952270c17025047b19a09871.png)
和echo命令一样,最好用双引号把参数括起来,这样做可以增加时间输出格式的多样性。同样,上图还能说明,加号可以放在引号外面。
3.timedatectl
timedatectl命令主要用于显示(设置)时间、日期和时区。
其命令格式为:timedatectl [参数]
参数 | 作用 |
status | 显示状态信息 |
set-time | 设置时间、日期 |
set-timezone | 设置时区 |
list-timezones | 列出已知时区 |
查看系统时间和时区的命令如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f7d8298d45533f4a1b76ddda7f388a37.png)
通过timedatectl命令修改系统的日期、时间、时区,如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/99bfdce8978a0378cd7976bed1b91eb7.png)
查看修改后的时间、日期、时区:
![](https://i-blog.csdnimg.cn/blog_migrate/9e0abb1d6229445debe155aba8857a47.png)
在修改时间时,可能会遇到图3-4所示的情况:
![](https://i-blog.csdnimg.cn/blog_migrate/2db2dc2482a01687291796873644292d.png)
这是由于系统打开了联网后自动更新时间和日期选项,我们在设置中找到Date&Time选项,将 ON 都改成OFF即可,如下图所示
![](https://i-blog.csdnimg.cn/blog_migrate/d347367ccfa0ffb66a312490e9a37caf.png)
关闭后,再次用timedatectl命令即可更改时间。
![](https://i-blog.csdnimg.cn/blog_migrate/b02c7603cddf257eb35111c5b8dbcf99.png)
4.reboot命令
reboot命令用于系统的重启。直接在命令行中键入“reboot”命令,然后运行即可。
![](https://i-blog.csdnimg.cn/blog_migrate/4a672d6d507a1159948bee512419ed9f.png)
5.poweroff命令
poweroff命令用于关闭系统。直接键入并运行即可。
![](https://i-blog.csdnimg.cn/blog_migrate/8e0e95a8266f02e6eebca2c66cc7fe4c.png)
6. wget命令
wget命令用于在终端命令行中下载网络文件,全称为“web get”。
命令格式为:wget [参数] 网络地址
参数 | 作用 |
-b | 后台下载模式 |
-P | 下载到指定的目录 |
-t | 最大尝试次数 |
-c | 断点续传 |
-p | 下载页面内所有资源,包括图片、视频等 |
-r | 递归下载 |
由于网络模式设置的是,仅使用主机网络,所以这条指令暂时先了解即可。后面会学。
7.ps命令
ps命令用于查看系统中的进程状态。命令格式为:ps [参数]
参数 | 作用 |
-a | 显示所有进程(包括其他用户的进程) |
-u | 用户以及其他详细信息 |
-x | 显示没有控制终端的进程 |
输入“ps”命令时,响应如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/b50e6f591214da21b248b7f8e886a52a.png)
输入“ps a” 命令,查看所有用户的进程,如图7-2所示。
![](https://i-blog.csdnimg.cn/blog_migrate/882e57f76cdd6f094455366f69f617de.png)
使用“ps u”命令,查看本用户进程及其他信息,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/25723564f8f875932819f6be23d3deb8.png)
输入“ps x”显示没有控制终端的进程,如图7-4所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e88ef4137237954d1647de6133abc31c.png)
输入 “ps aux”命令,它的输出结果就是以上三个命令取并集。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e256e457d857fb23da02a79cabc4dcb0.png)
上面几幅图中,%CPU——运算器占用率;%MEM——内存占用率;TTY——所在终端; STAT——进程状态
Linux系统中有五种常见的进程状态,分别为运行、中断、不可中断、僵死、停止,其各自含义,若下所示:
运行(R):进程正在执行或在运行队列中等待
中断(S):进程处于休眠状态,当某个条件形成后或者接受到信号时,则脱离该状态。
不可中断(D):进程不响应系统异步信号,即便用kill命令也无法将其中断。
僵死(Z):进程已经终止,但进程描述符依然存在,直到父进程调用wait4()系统函数后将进程释放。
停止(T):进程收到停止信号后停止运行。
除上述五种进程状态外,还有高优先级(<)、低优先级(N)、被锁进内存(L)、包含子进程(s)、多线程(1)这五种补充形式。
再写命令参数时,只有短格式与短格式才能进行合并,即 ps -a 、ps -u 、ps -x 可以合并成 ps -aux。而 执行ps命令时,“-”可以省略,故可以写成 ps aux。
8.pstree命令
pstree命令可以用树状图的形式展示各进程之间的关系。输入该命令后按回车键即可执行。
![](https://i-blog.csdnimg.cn/blog_migrate/5b54bd86ae4abae6c64b7d8127537ae3.png)
9.top命令
top命令可以动态的监视进程活动及系统负载情况。输入该命令直接按回车键即可执行。
![](https://i-blog.csdnimg.cn/blog_migrate/1caae06bbea39a464cfd5856768a8cce.png)
如上图所示,前五行为系统整体的统计信息,其代表含义如下:
第一行:系统时间、运行时间、登陆终端数、系统平均负载(1分钟、5分钟、15分钟)
第二行:进程总数、正在运行进程数、休眠进程数、停止进程数、僵死进程数
第三行:用户占用资源百分比、系统内核占用资源百分比、改变过优先级的进程资源百分比、空闲资源百分比
第四行:物理内存总量、内存空闲量、内存使用量、作为内核缓存的内存量
第五行:虚拟内存总量、虚拟内存空闲量、虚拟内存使用量、已被提前加载的内存量
10.nice命令
nice命令用于调整进程的优先级。命令格式为:nice 优先级数字 服务名称
在top命令的输出结果中,PR和NI的值表示进程的优先级,它们数字越低,进程的优先级就越高(NI的取值范围是:-20~19)。我们可以把bash的优先级调成最高,如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/0e8249a419e38ad63493824adb9462ec.png)
11.pidof命令
此命令可以用于查询指定服务进程的PID号码值。命令格式为:pidof [参数] 服务名称
每个进程的号码值(PID)是唯一的,可以用于区分不同的进程。下图是查询sshd服务程序的PID:
![](https://i-blog.csdnimg.cn/blog_migrate/d7367e5996c85b54df0975ab93c41484.png)
12.kill命令
kill命令是用来终止某一指定进程号的服务进程。命令格式:kill [参数] PID值
接下来,使用kill命令把上面查到的PID所代表的进程终止掉。
![](https://i-blog.csdnimg.cn/blog_migrate/6f804a54677eb6f45ef3875515b41426.png)
有时系统会提示进程无法被终止,此时可以加参数“-9”,表示最高级别的强制杀死进程。
13.killall命令
killall命令用于终止某一指定名称的服务所对应的全部进程。命令格式:killall [参数] 服务名称
通常,复杂软件的服务程序会有多个进程协同为用户提供服务,若用kill逐个终止,太过麻烦,此时可用killall批量终止某个服务程序的全部进程。
最后,若有命令在执行时不断地在屏幕上输出信息,影响后续命令的输入,则可在执行命令时在末尾添加一个 & 符号,这样命令将进入系统后台来执行。
二.本次学习遇到的问题
1、top输出界面中PR和NI,分别表示什么意思?
2、在修改bash优先级是,它的修改逻辑是什么?
3、进程和程序之间的关系
4、进程状态中:中断、僵死、停止之间的区别?
三、问题的答案及解决办法
1、不管如何设置优先级,实时进程对于 CPU 的抢占能力一定大于非实时进程
NICE值:表示静态优先级,反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别,这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。PR值:叠加过 NI 的动态优先级,其值越小,优先级越高。参考至https://blog.csdn.net/lovely_nn/article/details/130676255https://blog.csdn.net/lovely_nn/article/details/130676255
2、如下图所示,使用命令“ ps -o pid,ppid,ni,args -C bash”来查看未修改过优先级的bash的NI值,输出显示为0;使用nice命令修改bash的优先级后,再次查看bash的NI值,发现变成了5(0+5);最后再次修改bash的优先级并查看,发现bash优先级变成了3(5-2)。由此可见nice命令修改优先级的逻辑就是,在上次服务进程的NI值上,再加上此次修改的参数。
![](https://i-blog.csdnimg.cn/blog_migrate/18d22aca3e9a728eb93c4f1b56c7b07b.png)
补:在你输入 nice -n 10 bash 更改 bash 优先级之后,后续的命令会在新创建的 bash 子进程中执行,并且该子进程的优先级已经被设置为较低的优先级。因此,当你输入 top 命令时,它将在你更改过优先级的 bash 子进程中执行,而不是原始的 bash 进程中执行。换句话说,每次你使用 nice 命令来创建一个新的 bash 子进程并更改其优先级后,后续的命令解释都会在这个新创建的 bash 子进程中执行,直到你退出当前的 bash 子进程会话。这时再使用 ↑↓ 无法调用上一个bash中执行过的命令。
3、程序是一个静态的概念,它只是存储在磁盘上的一段代码。而进程是程序的一个动态实例,是程序在内存中的执行状态。一个程序可以被多个进程同时执行,每个进程都有自己的执行环境和资源。总的来说,程序是静态的代码集合,而进程是程序的执行实例,是动态的实体,存在于计算机内存中,并由操作系统进行管理。
在一些特殊的环境中,比如一些虚拟化技术或容器技术中,一个进程可能会扮演多个程序的角色。例如,在容器中,多个程序可能会运行在同一个进程中,但它们在容器的环境中被视为独立的应用程序。因此,严格来说,一个进程通常对应一个程序的执行实例,但在一些特殊情况下,一个进程可能会对应多个程序,这取决于具体的实现和环境。
4、