目录
系统进程
ps命令
top命令
pgrep命令
pstree命令
jobs命令
计划任务
一次性计划任务at
周期性计划任务crontab
系统进程
我们系统在打开的一瞬间就会加载很多进程,那么我们该如何查看这些进程和管理这些进程呢?
ps命令
常用的参数
-a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
-u:使用以用户为主的格式输出进程信息。
-x:显示当前用户在所有终端下的进程信息。
一般直接用 ps -aux 组合使用
上述输出信息中,第一行为列表标题,其中各字段的含义描述如下
USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
%CPU:CPU占用的百分比。
%MEM:内存占用的百分比。
VSZ:该进程使用的虚拟内存量(KB)。
RSS:该进程占用的物理内存量(KB)。
TTY:表明该进程在哪个终端上运行。不是从终端启动的进程则显示为?。
STAT:该进程的状态(包括 :D:不可中断的休眠状态:R:正在运行状态;S:处于休眠状态,可被唤醒;T:停止状态,可能是在后台暂停或进程处于跟踪调试状态: Z:僵尸进程,进程已经中止,但是部分程序还在内存当中)
状态后面还有一些字符,它们含意如下:
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台(这里有前台那肯定有后台,在命令后面加上&可以将操作直接放至后台,如后台复制光盘镜像可以用cp /dev/cdrom /home/cetos7.iso &)
D:系统守护进程
然后我们书接上文:
START:启动该进程的时间。
TIME:该进程占用的 CPU 时间。
COMMAND:启动该进程的命令的名称
下面我们来尝试改变一个进程的状态,并查看验证。
首先我们双击连接,重新打开一个终端,称为终端ZDB,在此终端vim a.txt 编辑一个文件
这时候我们回到第一个终端,下面称为ZDA,然后我们输入
ps -aux | grep a.txt 查看a.txt 的进程状态
现在我们回到ZDB然后按ctrl z 停止,这时候在ZDA再次输入ps -aux | grep a.txt
我们可以看到
这里解释一下 ctrl c 是发送 SIGINT 信号,终止一个进程 ctrl-z 是发送 SIGSTOP 信号,挂起一个进程。将作业放置到后台(暂停) 。ctrl-d 不是发送信号,代表输入完成或者注销。
除了ps -aux还有ps -elf ,这个命令的意思是以长格式显示系统中的进程信息
这里其实和 -aux大同小异
F:内核分配给进程的系统标记。
S:进程的状态。
UID:启动这些进程的用户。
PID: 进程的进程ID.
PPID:父进程的进程号(如果该进程是由另一“个进程启动的)
C:进程生命周期中的CPU利用率。
PRI:进程的优先级(越大的数字代表越低的优先级)。
NI: 谦让度值用来参与决定优先级。
ADDR:进程的内存地址。
SZ:假如进程被换出,所需交换空间的大致大小。
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名。
STIME:进程启动时的系统时间。
TTY:进程启动时的终端设备。 pts/0255代表虚拟终端,一般是远程连接的终端;tty1tty7 代表本地控制台终端。
TIME:运行进程需要的累计CPU时间。
CMD:进程的启动命令。
top命令
top命令可以动态的查看进程状态,默认每3s刷新一次
上述输出信息中
13:22:30 当前时间;
up 2:39系统运行时间 ,说明此服务器连续运行 两个小时39分钟了;
2 user 当前登录用户数;
load average 系统负载,即任务队列的平均长度;
系统任务(Tasks)信息:total,总进程数;
running,正在运行的进程数;
sleeping, 休眠的进程数;
stopped,中止的进程数;
zombie,僵死无响应的进程数;
CPU 占用信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲CPU;wa,I/O 等待占用;hi,硬件中断占用;si,软件中断占用;st,虚拟化占用。要了解空闲的 CPU 百分比,主要看%id 部分。
内存占用(Mem)信息:total,总内存空间;free,空闲内存;used,已用内存;buff/cache,物理内存和交换内存的缓冲区总和。
交换空间(Swap)占用:total,总交换空间;free,空闲交换空间;used,已用交换空间;avail Mem,可用物理空间。
下面我们来进行实验。
首先我们在ZDA执行top
然后我们去ZDB执行 dd if=/dev/zero of=/a.txt count=10 bs=100M
(这里注意不要设置太大,不然系统会卡死,进程将内存占满,远程连接会中断,如果一不小心弄爆了,需要进入虚拟机页面打开终端。 然后使用 rm -rf /a.txt 命令强制删除a.txt
删除后可能系统内存仍然不足,需要清理系统缓存和临时文件:
sync
echo 3 > /proc/sys/vm/drop_caches
(注:所有操作都是管理员账户执行
然后我们接着上面说,创建了1GB文件后,回到ZDA我们就可以看到dd这个命令的CPU使用率一下子窜上来了,有的虚拟机可能创建的时候分配的cpu比较强,这里可以适当的增大创建的文件。
op命令界面中可以通过按键对特定数值进行排序查看
P 按CPU使用率排序
M 按内存使用率排序
T 按运行时间长短排序
N 按进程ID排序
p: 进程 IP,查看某个进程状态
数字键 1:显示每个内核的 CPU 使用率
U:指定显示的用户
h:可以获得 top 程序的在线帮助信息
q:键可以正常地退出 top 程序
上面我们提到,默认 3s 刷新一次,在top命令界面下按 s 修改刷新时间按空格 :立即刷新,输入数字就是夺少秒。
注:若通过 top 排名工具发现某个进程 CPU 占用率非常高,需要终止该进程的运行,可以在 top 操作界面中按 k 键,然后在列表上方将会出现如下提示信息
根据提示输入指定进程的 PID 号并按 Enter 键, 出现二次确认的提示信息,然后继续按Enter 键确认即可终止对应的进程。
pgrep命令
pgrep命令可以产看进程信息
-l:选项可同时输出对应的进程名以及PID
-U:选项查询特定用户的进程
-t:选项查询在特定终端运行的进程
如上面用到的pgrep -l vim 就是查看名为vim的进程,或者名字中包含vim。
pstree命令
以树形结构列出进程信息
-p:选项使用时可以同时列出对应的PID号
-u:选项可以列出对应的用户名
-a:选项可以列出完整的命令信息
通常直接用 pstree -aup 组合起来使用,可以查看当前系统的进程树,包括各进程对应的PID 号、用户名、完整命令等信息。
jobs命令
jobs命令用于查看后台运行的进程
-l:选项可以同时显示该进程对应的PID号
jobs -l显示出后台进程列表
可以用 fg 加上进程号 将该进程放至前台
当我们对一些程序进行操作后,发现进程关不掉了,这时候我们需要用到kill命令来杀死进程。使用kill命令我们需要知道进程的PID,若该进程已经无法响应终止信号,则可以结合“-9” 选项强行终止进程。
下面我们来测试一下
进入到ZDB,vim testfile & 打开vim 程序并挂起
回到ZDA,jobs –l 查询目标进程的PID 号
kill 3459 尝试正常结束进程
但发现vim 进程并未退出
这时候我们用 kill -9 3549 强制终止目标进程,然后我们再来查看,可以看到进程已经被残忍的杀死了。
然后,当需要结束系统中多个相同名称的进程时,使用 killall 命令将更加方便,效率更高。killall 命令同样也有“-9”选项。下面我们同样来测试一下
进到ZDB,挂起两个vim进程
vim testfile1 &
vim testfile2 &
回到ZDA,查看,
killall -9 vim 强制终止进程名为vim的进程,可以看到两个vim进程都被杀死了(我创了三个)
使用 pkill 命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与 pgrep 命令基本类似,如“-U”(指定用户)、“-t”(指定终端) 等。如,要终止由用户 zhangsan启动的进程(包括登录 Shell),可以执行以下操作。
在ZDB上创建用户zhangsan 这里我们就不细说了,vim t1 & 后台运行vim
然后我们回到ZDA,
pgrep –l -U "zhangsan" 查看zhangsan这小子正在后台搞什么
pkill -9 -U "zhangsan" 管他干什么肯定没干好事,直接给他全部禁止
pgrep -l -U "zhangsan" 再查看一下,万一有活着的要补枪。
然后我们回到zhangsan那边,zhangsan此时并不知情,正在用vim文本编辑器开心地写小说,突然
画面变成这样了,什么都操作不了了,我们成功了。
计划任务
有些时候我们可能在特定的时间进行一些操作,但是好巧不巧,那个时间点我们恰好有事情要处理,但是这个操作又不得不执行,面对这种两难的情况,我们就需要用到计划任务,即在指定的时间让系统进行指定的操作。
一次性计划任务at
使用at命令设置的计划任务只在指定的时间点执行一次,需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后, 否则将无法正确设置计划任务。
设置一次性计划任务时,在 at 命令行中依次指定计划执行任务的时间、日期作为参数 (若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间)
过程大概是,at [时间(格式:xx:xx)] [日期(格式:xxxx-yy-dd)],回车后进入带“at>”提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D 组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。
下面我们来举个例子实际操作一下。
设置在 2024 年 6 月 27 日的16:35 自动执行以下任务:统计该时间点系统中由 root 用户运行的进程的数量,并将该数值保存到/opt/ps.root 文件中。ps:现在是北京时间2024.6.27 16:32
at 16:23 2021-08-16
at> pgrep -U root | wc -l > /opt/ps.root 任务设置完毕后按Ctrl+D 组合键提交
这时候我们查看ps.root会提示没有这个文件,别着急,让子弹飞一会,待到山花烂漫时,文件就在灯火阑珊处
再看一下,有啦有啦
下班后人先走机器开着再装一会,领导问到就说上厕所去了,然后九点半再关机,也可以用计划任务来操作。
at 21:30
at> shutdown -h now
at> <EOT>
然后ctrl d 提交
对于已经设置但还未执行的计划任务,可以通过 atq 命令进行查询。已执行过的任务将不会再出现在列表中。
若要删除指定编号的计划任务,可以使用 atrm 命令。删除后的任务将不会被执行,并且不会显示在 atq 命令的结果中,已经执行过的任务无法删除,毕竟它都不会显示的...
于是我们发现,删除后在查看就无了,真是个相当伟大的发现
周期性计划任务crontab
周期性计划任务约等于就是永久性计划任务了,设置周期性计划任务列表主要通过 crontab 命令进行,结合不同的选项可以完成不同的计划任务管理操作,常用的选项如下
-e:编辑计划任务列表。
-u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。
-l:列表显示计划任务。
-r:删除计划任务列表。
这里特别讲一下周期性计划任务的时间设置,它是有顺序的,按照“分”“时”“日”“月”“周”的顺序依次设置。“*”代表任意值;“-”代表连续区间;“/”可以直接理解为'每',/5 意思是每五天;“,”用来表示不连续的区间。然后
分钟:0-59
小时:0-23
日期:1-31
月份:1-12
星期:0-7 (0 和 7 都表示星期日)
这么说可能有点抽象,好吧不是有点,是非常。但是,你得先大概看一下上面这些代表个啥。
然后我们来用例子讲一下
crontab -e 进入计划任务编辑表 (这个应该不难懂
然后我们来设置一个每天早上7:50自动开启 sshd 服务
50 7 * * * /usr/bin/systemctl start sshd.service
你看,这个时间就是按照“分”“时”“日”“月”“周”的顺序排的,50是分钟,7是小时,就是七点五十,后面“日”“月”“周”都是“*”,说明什么?看看上面刚写的,“*”代表任意值,什么意思?顾名思义啊,就是随便哪天,随便哪一个月,随便周几,那不就是每天吗?
后面那一坨不管,就是代表着启动sshd服务,但是,它加了个路径,这是为什么呢?因各条计划任务在执行时并不需要用户登录,所以计划任务建议使用绝对路径,避免因缺少执行路径而无法执行命令的情况。
另外,在设置非每分都执行的任务时,“分”字段也应该填写一个具体的时间数值,而不要保留为默认的“*”,否则将会在每分钟执行一次计划任务。
下面再来个例子,每隔五天重启一下httpd服务
0 0 */6 * * /usr/bin/systemctl httpd restart
“分”“时”都是0,就是一天的0点0分,*/6就代表,每六天,无论哪一个月或者哪周几。
那如果我想要每周一、周三、周五的下午两点半重启一下httpd服务呢
30 14 * * 1,3,5 /usr/bin/systemctl httpd restart
这个应该不用再解释了吧
我们可以用crontab -l命令来查看用户的计划任务列表
对于 root 用户来说,还可以结合“-u”选项查看其他用户的计划任务,用法和刚才的pgrep差不多,很简单的,
crontab -l -u zhangsan 就可以知道zhangsan这小子肚子里装的什么坏水
crontab -r -u zhangsan 直接删除zhangsan的计划任务,让他中道崩殂