Linux进程管理

什么是进程

进程与pid的关系

在程序被执行前,他们不过是硬盘或者其他存储介质中的一个文件。一旦被加载到内存中,程序会根据执行者的权限属性生成一串程序执行参数,并生成一个进程号,即PID。后续我们就可以根据这个PID完成对进程的监控和管理。

在这里插入图片描述

子进程

子进程即由父进程操作中诞生的进程,即我们在某个父进程中所启动的程序或执行的指令。

为了更好的了解什么是子进程,我们可以在终端键入bash

bash

再用ps -l查看,可以看到这样一个二维表格,可以看到每一个指令的执行我们都可以看作是一个进程,它们都有一个PID作为标识,并且在PID后方还有一个PPID 这就是指明了当前进程的父进程号,以PS为例,可以看到其PPID就是第二行bash的进程号,这也就意味这这个ps指令是在我们启动bash指令后在这个bash指令界面所执行的进程指令。

F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   4844   4833  0  80   0 - 29192 do_wai pts/0    00:00:00 bash
4 S     0   5445   4844  0  80   0 - 29213 do_wai pts/0    00:00:00 bash
0 R     0   5480   5445  0  80   0 - 38331 -      pts/0    00:00:00 ps

父进程是如何执行子进程的

已上面在bash指令中键入ps的指令为例,在操作系统内核中的执行流程为父进程bashfork出一个进程,我们成为中间暂存程序,它以执行fork指令的进程的进程作为自己的父进程,并生成一个自己的进程号。然后fork出来的进程执行exec命令从磁盘中将程序加载到内存中成为当前进程的子进程。

在这里插入图片描述

后台进程

crond每分钟都会到/etc/crontab表中获取需要需要运行的的进程信息,而crond就是我们常说的后台进程,也是常年停留在内存中的进程,这种进程我们也可以称他们为damon(服务)

Linux的多人多任务环境

多人环境

Linux支持多人操作,即使不同用户使用root账号一样可以登录,所以操作系统通过用户登录后操作bashPID的不同为用户加以区分。

在这里插入图片描述

多任务行为

CPU的速度可达Ghz,即每秒钟都能执行10^9个指令,所以即使你在运行多个任务,也几乎不会感觉到阻塞,所以Linux系统才能支持多人多任务

后台进程

我们希望某些指令可以在系统后台运行,然后我们在此期间能够做别的事情,Linux已经给我们提供了这样一个操作,以我们创建文件为例,若我们希望创建文件这个操作直接在前台完成,那么我们可直接使用常规命令:

 touch file1

假如我们希望这个操作在后台就可以完成,我们只需在执行的指令后面加上一个&即可:

cp file1 file2 &

可以看到终端输出了一个进程号,所以这个任务现在是一个PID为6006的任务在后台运行:

[1] 6006

工作管理

前台进程和后台进程

前台进程:我们在终端与操作系统交互的命令就叫做前台进程。
后台进程: 那些无需和我们进行任何交互且不能使用ctrl+c停止的进程就是后台进程。

Job Control的管理

进程后台执行示例

我们希望打包命令可以在后台运行,我们可以在使用tar命令进行压缩的时候加了个&

tar -zpcf /tmp/etc.tar.gz /etc/ &

可以看到界面输出了一个PID6137,证明此时打包任务就在后台运行,我们在此期间就可以完成一些别的事情:

[1] 6137

当打包进程运行结束就会自动弹出一个Done,就说明我们的打包任务正式完成了:

[1]+  Done                    tar -zpcf /tmp/etc.tar.gz /etc/

todo

有时候我们的命令虽然可以在后台运行,所以在执行tar命令的补充-v选项会将压缩过程中的文件名输出到控制台:

tar -zpcvf /tmp/etc.tar.gz /etc/ &

所以我们可以使用数据流重定向将输出结果存到一个文本文件中

# 使用管道流将压缩过程存到日志文件中
[root@localhost tmp]# tar -zpcvf /tmp/etc.tar.gz /etc/ >/tmp/tar.log 2>&1 &
[1] 6214
[root@localhost tmp]# ls
etc.tar.gz  swap  tar.log
[1]+  Done                    tar -zpcvf /tmp/etc.tar.gz /etc/ > /tmp/tar.log 2>&1
[root@localhost tmp]#

将进程暂停

如下所示,笔者键入两条命令并且都用ctrl+z将其暂停


[root@localhost tmp]# vim ~/.bashrc[1]+  Stopped                 vim ~/.bashrc[root@localhost tmp]# find / print
[2]+  Stopped                 find / print

然后我们就可以使用jobs命令查看被暂停的进程,如下所示-表示倒二暂停的进程,+号表示倒一个被暂停的进程

[root@localhost tmp]# jobs -l
[1]-  6456 Stopped                 vim ~/.bashrc
[2]+  6458 Stopped                 find / print

更多指令查阅

[root@study ~]#  jobs [- - lrs]
选项与参数:
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码;
-r :仅列出正在背景 run 的工作;
-s :仅列出正在背景当中暂停 (stop) 的工作。

将工作调回前台

键入fg,即可将倒数第一个进程调入前台

fg

我们使用jobs命令查看当前暂停进程,看到1为vim命令,所以我们使用fg %1,即可回到vim操作


[root@localhost tmp]# jobs -l
[1]-  6456 Stopped                 vim ~/.bashrc
[2]+  6458 Stopped                 find / print# 此时就会回到vim操作
[root@localhost tmp]# fg %1
vim ~/.bashrc

让进程在后台运行

如下所示,我们希望搜寻权限为7000的文件,我们按ctrl z使其暂停,又希望他能够继续在后台运行,我们就可以通过bg +暂停时控制台输出的id值,如下命令所示为4,所以我们使用bg %4使其在后台运行。

# 键入查询命令并暂停
[root@localhost tmp]# find / -perm /7000 > /tmp/1.txt
^Z
[4]+  Stopped                 find / -perm /7000 > /tmp/1.txt
# 使其调入后台继续running
[root@localhost tmp]# jobs;bg %4;jobs
[2]-  Stopped                 find / print
[3]   Running                 find / -perm /7000 > /tmp/1.txt &
[4]+  Stopped                 find / -perm /7000 > /tmp/1.txt
[4]+ find / -perm /7000 > /tmp/1.txt &
[2]+  Stopped                 find / print
[3]   Running                 find / -perm /7000 > /tmp/1.txt &
[4]-  Running                 find / -perm /7000 > /tmp/1.txt &

杀死进程

我们希望将jobs中某些暂停的进程杀死,就可以使用kill命令,如下所示

# 查看jobs
[root@localhost tmp]# jobs
[2]+  Stopped                 find / print
# 上面显示id为2,我们就用 -9强制将2进程杀死
[root@localhost tmp]# kill -9 %2;jobs
[2]+  Stopped                 find / print# 查看是否杀死
[root@localhost tmp]# jobs;
[2]+  Killed                  find / print
[root@localhost tmp]# jobs;
[root@localhost tmp]#

更多命令参阅

[root@study ~]#  kill - - signal %jobnumber
[root@study ~]#  kill - -l l
选项与参数:
-l :这个是 L 的小写,列出目前 kill 能够使用的讯号 (signal) 有哪些?
signal :代表给予后面接的那个工作什么样的指示啰!用 man 7 signal 可知:
-1 :重新读取一次参数的配置文件 (类似 reload)-2 :代表与由键盘输入 [ctrl]-c 同样的动作;
-9 :立刻强制删除一个工作;
-15:以正常的进程方式终止一项工作。与 -9 是不一样的

脱机管理问题

上文介绍的命令虽然可以在后台执行,但这些进程都是基于我们的bash父进程,一旦我们退出终端,这些命令都结束,所以我们可以使用nohup的脱机命令完成进程始终在后台执行

# 编写一个睡眠脚本内容为
#!/bin/bash
/bin/sleep 500s
/bin/echo "I have slept 500 seconds."[root@localhost tmp]# vim sleep.sh
# 赋权
[root@localhost tmp]# chmod a+x sleep.sh
[root@localhost tmp]# vim sleep.sh
# 使用nohup &后台运行
[root@localhost tmp]# nohup ./sleep.sh &
[1] 7860
[root@localhost tmp]# nohup: ignoring input and appending output to ‘nohup.out’

使用其他终端查看,发现仍然运行,说明我们的操作成功了


[root@localhost ~]# ps -ef|grep sleep
root       7860   5445  0 00:11 pts/0    00:00:00 /bin/bash ./sleep.sh
root       7861   7860  0 00:11 pts/0    00:00:00 /bin/sleep 500s
root       7949    783  0 00:11 ?        00:00:00 sleep 60
root       7993   7878  0 00:12 pts/1    00:00:00 grep --color=auto sleep

进程管理

进程的观察

ps指令

选项与参数:
-A :所有的 process 均显示出来,与 -e 具有同样的效用;
-a :不与 terminal 有关的所有 process ;
-u :有效使用者 (effective user) 相关的 process ;
x :通常与 a 这个参数一起使用,可列出较完整信息。
输出格式规划:
l :较长、较详细的将该 PID 的的信息列出;
j :工作的格式 (jobs format)
-f :做一个更为完整的输出。

仅观察自己登录的账号所使用的进程

[root@localhost zhangshiyu]# ps -l
# 输出结果介绍
# F 若为4则说明的以root权限开启的,若为1则说明是仅进行fork没有进行实际的exec
# S 则是进程状态的描述 T说明进程停止 S说明进程在休眠 R说明进程在运行 D说明不可被唤醒 Z则是僵尸进程
# UID    PID   PPID 分别是用户id 进程id 进程的父进程id
# C 则是cpu的使用率的说明,单位是百分比
# PRI  NI则是进程优先级的值 具体后文会展开描述
# ADDR表示进程在系统内存的哪个位置,若为-则说明是running,sz表示用掉多少内存,WCHAN 表示进程是否在运作中,-则说明在运作中
# TTY  用户使用的终端位置
# TIME 表示此进程耗费CPU的时间
# cmd 该进程是通过什么指令运行的
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 T     0  41946  41864  0  80   0 - 55370 do_sig pts/1    00:00:00 passwd
4 S     0  42718  41864  0  80   0 - 58087 do_wai pts/1    00:00:00 su
4 S     0  42730  42718  0  80   0 - 29238 do_wai pts/1    00:00:00 bash
4 S     0  42926  42730  0  80   0 - 57988 do_wai pts/1    00:00:00 su
4 S     0  43478  42927  0  80   0 - 58087 do_wai pts/1    00:00:00 su
4 S     0  43489  43478  0  80   0 - 29246 do_wai pts/1    00:00:00 bash
0 R     0  62668  43489  0  80   0 - 38331 -      pts/1    00:00:00 ps

列出当前在内存中运行的所有进程

[root@localhost zhangshiyu]# ps aux
# USER 该进程属于哪个使用者  
# PID 当前进程的唯一标识
# %CPU 当前进程消耗CPU所占用的百分比
# %MEM 当前进程所消耗内存的百分比
# VSZ  使用掉的虚拟内存量 
# RSS 进程固定占用内存的量
# TTY  为0则说明是网络登录的连接者,1-6则是本机使用者
# STAT 当前进程状态 标识与上描述的D T R Z S一致
# START  进程被启动的时间
# TIME 进程实际使用的CPU运作时间
# COMMAND 该进程实际使用的命令是什么
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.4 210328  4524 ?        Ss   Jul02   0:09 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    Jul02   0:00 [kthreadd]
root          4  0.0  0.0      0     0 ?        S<   Jul02   0:00 [kworker/0:0H]
root          6  0.0  0.0      0     0 ?        S    Jul02   0:00 [ksoftirqd/0]
root          7  0.0  0.0      0     0 ?        S    Jul02   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    Jul02   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        R    Jul02   0:00 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S<   Jul02   0:00 [lru-add-drain]
root         11  0.0  0.0      0     0 ?        S    Jul02   0:00 [watchdog/0]
root         13  0.0  0.0      0     0 ?        S    Jul02   0:00 [kdevtmpfs]
root         14  0.0  0.0      0     0 ?        S<   Jul02   0:00 [netns]
root         15  0.0  0.0      0     0 ?        S    Jul02   0:00 [khungtaskd]
root         16  0.0  0.0      0     0 ?        S<   Jul02   0:00 [writeback]
root         17  0.0  0.0      0     0 ?        S<   Jul02   0:00 [kintegrityd]
root         18  0.0  0.0      0     0 ?        S<   Jul02   0:00 [bioset]
root         19  0.0  0.0      0     0 ?        S<   Jul02   0:00 [bioset]
root         20  0.0  0.0      0     0 ?        S<   Jul02   0:00 [bioset]
root         21  0.0  0.0      0     0 ?        S<   Jul02   0:00 [kblockd]
root         22  0.0  0.0      0     0 ?        S<   Jul02   0:00 [md]

列出系统运行的所有进程

[root@localhost zhangshiyu]# ps -lA
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0      1      0  0  80   0 - 52582 ep_pol ?        00:00:09 systemd
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      4      2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H
1 S     0      6      2  0  80   0 -     0 smpboo ?        00:00:00 ksoftirqd/0
1 S     0      7      2  0 -40   - -     0 smpboo ?        00:00:00 migration/0

以进程树的格式 输出进程

[root@localhost zhangshiyu]# ps axjfPPID    PID   PGID    SID TTY       TPGID STAT   UID   TIME COMMAND0      2      0      0 ?            -1 S        0   0:00 [kthreadd]2      4      0      0 ?            -1 S<       0   0:00  \_ [kworker/0:0H]2      6      0      0 ?            -1 S        0   0:00  \_ [ksoftirqd/0]2      7      0      0 ?            -1 S        0   0:00  \_ [migration/0]2      8      0      0 ?            -1 S        0   0:00  \_ [rcu_bh]2      9      0      0 ?            -1 R        0   0:00  \_ [rcu_sched]2     10      0      0 ?            -1 S<       0   0:00  \_ [lru-add-drain]2     11      0      0 ?            -1 S        0   0:00  \_ [watchdog/0]2     13      0      0 ?            -1 S        0   0:00  \_ [kdevtmpfs]2     14      0      0 ?            -1 S<       0   0:00  \_ [netns]2     15      0      0 ?            -1 S        0   0:00  \_ [khungtaskd]2     16      0      0 ?            -1 S<       0   0:00  \_ [writeback]2     17      0      0 ?            -1 S<       0   0:00  \_ [kintegrityd]2     18      0      0 ?            -1 S<       0   0:00  \_ [bioset]

找出与 cron 与 rsyslog 这两个服务有关的 PID 号码

[root@localhost zhangshiyu]# ps aux | egrep '(cron|rsyslogd)'
root       1324  0.0  0.2 214432  2860 ?        Ssl  Jul02   0:02 /usr/sbin/rsyslogd -n
root       1356  0.0  0.0 126388   496 ?        Ss   Jul02   0:00 /usr/sbin/crond -n

top指令(动态观察进程的变化)

[root@study ~]#  top [- - d  数 字 ] | top [- - bnp]
选项与参数:
-d :后面可以接秒数,就是整个进程画面更新的秒数。预设是 5 秒;
-b :以批次的方式执行 top ,还有更多的参数可以使用喔!
通常会搭配数据流重导向来将批次的结果输出成为文件。
-n :与 -b 搭配,意义是,需要进行几次 top 的输出结果。
-p :指定某些个 PID 来进行观察监测而已。
在 top 执行过程当中可以使用的按键指令:
? :显示在 top 当中可以输入的按键指令;
P :以 CPU 的使用资源排序显示;
M :以 Memory 的使用资源排序显示;
N :以 PID 来排序喔!
T :由该 Process 使用的 CPU 时间累积 (TIME+) 排序。
k :给予某个 PID 一个讯号 (signal)
r :给予某个 PID 重新制订一个 nice 值。
q :离开 top 软件的按键。

每个2s输出一次系统资源使用情况

[root@localhost zhangshiyu]# top -d 2
# 第一行 代表系统开机时间为17:26:49,运行了20min,有两个用户在用,5 10 15分钟的负载,可以看到笔者的系统都是大于1,说明负载有点严重了
# 第2行 有220个任务,2个运行,2217个休眠,1个停止,0个僵尸进程
# 第三行之后就代表系统资源使用情况了,分别是cpu使用情况(us代表系统用户进程所占百分比,sy代表系统进程所占百分比,id空闲cpu所占的百分比。wa代表等待输入输出的进程所占百分比) 内存使用情况和 swap分区使用情况
# 后续的行输出结果和ps指令差不多不多赘述了 
top - 17:26:49 up 20:01,  2 users,  load average: 1.10, 1.08, 1.14
Tasks: 220 total,   2 running, 217 sleeping,   1 stopped,   0 zombie
%Cpu(s): 71.0 us, 29.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995672 total,   147376 free,   594708 used,   253588 buff/cache
KiB Swap:  2279412 total,  1980604 free,   298808 used.   213080 avail MemPID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND2526 root      20   0  608804   4068   1180 R 99.5  0.4   1115:11 vmtoolsd1 root      20   0  210328   4524   2212 S  0.0  0.5   0:09.77 systemd2 root      20   0       0      0      0 S  0.0  0.0   0:00.03 kthreadd4 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H6 root      20   0       0      0      0 S  0.0  0.0   0:00.34 ksoftirqd/07 root      rt   0       0      0      0 S  0.0  0.0   0:00.00 migration/08 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh9 root      20   0       0      0      0 S  0.0  0.0   0:00.89 rcu_sched10 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 lru-add-drain11 root      rt   0       0      0      0 S  0.0  0.0   0:00.22 watchdog/013 root      20   0       0      0      0 S  0.0  0.0   0:00.00 kdevtmpfs14 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 netns15 root      20   0       0      0      0 S  0.0  0.0   0:00.03 khungtaskd16 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 writeback17 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kintegrityd18 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset19 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset20 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 bioset21 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kblockd

将 top 的信息进行 2 次,然后将结果输出到 /tmp/top.txt

[root@localhost tmp]# top -n -b 2>/tmp/top.log
[root@localhost tmp]# ll
total 131076
-rw-------. 1 root root 134217728 Jun 30 19:32 swap
-rw-r--r--. 1 root root        34 Jul  3 17:32 top.log
[root@localhost tmp]#

我们自己的 bash PID 可由 $$ 变量取得,请使用 top 持续观察该 PID

[root@localhost tmp]# top -d 2 -p 43489
# 注意 此时我们在输出界面下按r ,在输入一个数字会修改ni的值,这个值会决定进程的优先级,ni值越大优先级越低
top - 17:34:24 up 20:09,  2 users,  load average: 1.14, 1.14, 1.14
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s): 69.7 us, 30.3 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :   995672 total,   147228 free,   594628 used,   253816 buff/cache
KiB Swap:  2279412 total,  1980604 free,   298808 used.   213144 avail MemPID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND43489 root      20   0  116984   3044   1204 S  0.0  0.3   0:00.10 bash

pstree指令

[root@study ~]#  pstree [- - A|U] [- - up]
选项与参数:
-A :各进程树之间的连接以 ASCII 字符来连接;
-U :各进程树之间的连接以万国码的字符来连接。在某些终端接口下可能会有错误;
-p :并同时列出每个 process 的 PID;
-u :并同时列出每个 process 的所属账号名称。

以ASCII字符输出当前进程树

[root@localhost tmp]# pstree -A
systemd-+-ModemManager---2*[{ModemManager}]|-NetworkManager---2*[{NetworkManager}]|-VGAuthService|-2*[abrt-watch-log]|-abrtd|-accounts-daemon---2*[{accounts-daemon}]|-alsactl|-at-spi-bus-laun-+-dbus-daemon---{dbus-daemon}|                 `-3*[{at-spi-bus-laun}]|-at-spi2-registr---2*[{at-spi2-registr}]|-atd|-auditd-+-audispd-+-sedispatch|        |         `-{audispd}|        `-{auditd}|-avahi-daemon---avahi-daemon|-bluetoothd|-boltd---2*[{boltd}]|-chronyd|-colord---2*[{colord}]|-crond|-cupsd|-2*[dbus-daemon---{dbus-daemon}]|-dbus-launch|-dconf-service---2*[{dconf-service}]|-dnsmasq---dnsmasq|-escd---{escd}|-evolution-addre-+-evolution-addre---5*[{evolution-addre}]|                 `-4*[{evolution-addre}]|-evolution-calen-+-evolution-calen---9*[{evolution-calen}]|                 `-4*[{evolution-calen}]|-evolution-sourc---3*[{evolution-sourc}]

以ASCII字符输出当前进程树,并显示user和pid,可以看到pstree可以帮我们看到某些进程的父进程,这样我们就可以顺着这棵树找到父进程,并将某些杀不死的进程连着父进程一起消灭

[root@localhost tmp]# pstree -Aup
systemd(1)-+-ModemManager(712)-+-{ModemManager}(730)|                   `-{ModemManager}(738)|-NetworkManager(854)-+-{NetworkManager}(858)|                     `-{NetworkManager}(862)|-VGAuthService(744)|-abrt-watch-log(710)|-abrt-watch-log(720)|-abrtd(709)|-accounts-daemon(690)-+-{accounts-daemon}(696)|                      `-{accounts-daemon}(707)|-alsactl(733)|-at-spi-bus-laun(2201)-+-dbus-daemon(2206)---{dbus-daemon}(2207)|                       |-{at-spi-bus-laun}(2202)|                       |-{at-spi-bus-laun}(2203)|                       `-{at-spi-bus-laun}(2205)|-at-spi2-registr(2211)-+-{at-spi2-registr}(2214)|                       `-{at-spi2-registr}(2215)|-atd(1357)|-auditd(661)-+-audispd(663)-+-sedispatch(665)|             |              `-{audispd}(666)

进程的管理

kill

格式

kill -数字 进程id

在这里插入图片描述

以 ps 找出 rsyslogd 这个进程的 PID 后,再使用 kill 传送讯息,使得 rsyslogd 可以重新读取配置文件

[root@localhost tmp]# ps aux |grep 'rsyslogd' | grep -v 'grep'
root       1324  0.0  0.2 214432  2872 ?        Ssl  Jul02   0:02 /usr/sbin/rsyslogd -n
[root@localhost tmp]# kill -1 1324
[root@localhost tmp]#

killall

相比于kill,killall无需关注pid也能将某些进程关闭

[root@study ~]#  killall [- - iIe] [command name]
选项与参数:
-i :interactive 的意思,交互式的,若需要删除时,会出现提示字符给用户;
-e :exact 的意思,表示『后面接的 command name 要一致』,但整个完整的指令
不能超过 15 个字符。
-I :指令名称(可能含参数)忽略大小写。

给予 rsyslogd 这个指令启动的 PID 一个 SIGHUP 的讯


[root@localhost tmp]# killall -1 rsyslogd
[root@localhost tmp]#

范例二:强制终止所有以 httpd 启动的进程 (其实并没有此进程在系统内)

killall -9 httpd

范例三:依次询问每个 bash 程序是否需要被终止运作!

[root@localhost tmp]# killall -i bash
Kill bash(41864) ? (y/N)==>按y则把当前命令终端关闭了,所以笔者不继续演示了

关于进程的执行顺序

上文用ps -l命令看到两个进程属性pri和ni,这个就是决定进程优先级的值,这两个值越小优先级越高

PRI(new) = PRI(old) + nice

如下图,CPU在执行队列中不同的进程时会根据优先级确定进程在执行的频率,优先级越高执行次数越多

在这里插入图片描述

由于pri这个值是系统计算的,所以若需要改变进程优先级,我们只能修改ni这个值

	root用户nice可以将nice值 -20~19,普通用户只能0~19(避免抢占系统资源进程优先级)

nice(修改一个新创建的进程的nice)

[root@study ~]#  nice [- n  数 字 ] command
选项与参数:
-n :后面接一个数值,数值的范围 -20 ~ 19

将后续vim的nice值-5

[root@localhost tmp]# nice -n -5 vim &
[2] 65834
[root@localhost tmp]# ps -l -p 65834
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 T     0  65834  43489  0  85   5 - 36807 do_sig pts/1    00:00:00 vim[2]+  Stopped                 nice -n -5 vim

renice(修改当前进程的nice值)

[root@localhost tmp]# ps -l |grep bash
4 S     0  42730  42718  0  80   0 - 29238 do_wai pts/1    00:00:00 bash
4 S     0  43489  43478  0  90  10 - 29246 do_wai pts/1    00:00:00 bash
# 如下所示将nice改为-10,pri最终变为80-10即70
[root@localhost tmp]# renice -10   43489
43489 (process ID) old priority 10, new priority -10
[root@localhost tmp]# ps -l |grep bash
4 S     0  42730  42718  0  80   0 - 29238 do_wai pts/1    00:00:00 bash
4 S     0  43489  43478  0  70 -10 - 29246 do_wai pts/1    00:00:00 bash

系统资源的观察

free(查看系统资源使用情况)

[root@study ~]#  free [ [- - b|- - k|- - m|- - g|- - h] [- - t] [- - s N - - c N]
选项与参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
k(Kbytes), 及 g(Gbytes) 来显示单位喔!也可以直接让系统自己指定单位 (-h)
-t :在输出的最终结果,显示物理内存与 swap 的总量。
-s :可以让系统每几秒钟输出一次,不间断的一直输出的意思!对于系统观察挺有效!
-c :与 -s 同时处理~让 free 列出几次的意思~
[zhangshiyu@localhost ~]$ free -m# 如下便是内存和交换分区的资源使用情况,需要了解的是swap分区使用量最好不要超过20%,一旦超过20%,你最好要考虑增加一张内存条了total        used        free      shared  buff/cache   available
Mem:            972         655         113          21         203         155
Swap:          2047         157        1890

uname查看系统核心相关

[root@study ~]#  uname [- - asrmpi]
选项与参数:
-a :所有系统相关的信息,包括底下的数据都会被列出来;
-s :系统核心名称
-r :核心的版本
-m :本系统的硬件名称,例如 i686 或 x86_64 等;
-p :CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型!
-i :硬件的平台 (ix86)

输出系统的基本信息

[zhangshiyu@localhost ~]$ uname -a
# 主机名 localhost.localdomain
# 核心版本3.10.0-1160.el7.x86_64
# 建立日期 2020 
# 使用与x86系统
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[zhangshiyu@localhost ~]$

uptime查看系统运行时长

输出的内容就是top命令的第一行,这里就不多做赘述了


[zhangshiyu@localhost ~]$ uptime20:37:25 up  4:10,  3 users,  load average: 0.00, 0.04, 0.08
[zhangshiyu@localhost ~]$

netstat(网络监控命令)

[root@study ~]#  netstat - - [atunlp]
选项与参数:
-a :将目前系统上所有的联机、监听、Socket 数据都列出来
-t :列出 tcp 网络封包的数据
-u :列出 udp 网络封包的数据
-n :不以进程的服务名称,以埠号 (port number) 来显示;
-l :列出目前正在网络监听 (listen) 的服务;
-p :列出该网络服务的进程 PID

基础使用

[zhangshiyu@localhost ~]$ netstat
# 输出结果
Active Internet connections (w/o servers)
# Proto:使用协议
# Recv-Q:用户未接受的socket总数,单位为bytes
# Send-Q:远程主机未确认字节数
# Local Address:本地主机地址
# Foreign Address: 远程主机地址
# State:连接状态
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost.localdoma:ssh 192.168.0.107:60960     ESTABLISHED
tcp        0     48 localhost.localdoma:ssh 192.168.0.107:60959     ESTABLISHED
tcp        0      0 localhost.localdoma:ssh 192.168.0.107:57437     ESTABLISHED
tcp        0      0 localhost.localdoma:ssh 192.168.0.107:57436     ESTABLISHED
Active UNIX domain sockets (w/o servers)
#Proto :基本是unix
# RefCnt 连接到此的socket进程总数
#Flags        联机的旗标
#  Type       :socket连接类型 ,STREAM     代表连接要进行确认,DGRAM    不需要确认联机
# State         连接状态,CONNECTED     表示已连接
# Path:连接到此程序的socket相关路径
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    20023    /var/run/chrony/chronyd.sock
unix  3      [ ]         DGRAM                    1416     /run/systemd/notify
unix  2      [ ]         DGRAM                    1418     /run/systemd/cgroups-agent
unix  5      [ ]         DGRAM                    1436     /run/systemd/journal/socket
unix  30     [ ]         DGRAM                    1438     /dev/log
unix  2      [ ]         DGRAM                    11980    /run/systemd/shutdownd
unix  3      [ ]         STREAM     CONNECTED     40063
unix  3      [ ]         STREAM     CONNECTED     32419
unix  3      [ ]         STREAM     CONNECTED     19668    /run/systemd/journal/stdout
unix  3      [ ]         STREAM     CONNECTED     39952
unix  3      [ ]         STREAM     CONNECTED     39946
unix  3      [ ]         STREAM     CONNECTED     28931
unix  3      [ ]         STREAM     CONNECTED     19614
unix  3      [ ]         STREAM     CONNECTED     41069    /run/dbus/system_bus_socket

找出当前连接的socket连接进程以及pid

[zhangshiyu@localhost ~]$ netstat -tulp
(No info could be read for "-p": geteuid()=1000 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:sunrpc          0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      -
tcp        0      0 localhost:ipp           0.0.0.0:*               LISTEN      -
tcp        0      0 localhost:smtp          0.0.0.0:*               LISTEN      -
tcp        0      0 localhos:x11-ssh-offset 0.0.0.0:*               LISTEN      -
tcp        0      0 localhost:6011          0.0.0.0:*               LISTEN      -
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN      -
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      -
tcp6       0      0 localhost:ipp           [::]:*                  LISTEN      -
tcp6       0      0 localhost:smtp          [::]:*                  LISTEN      -
tcp6       0      0 localhos:x11-ssh-offset [::]:*                  LISTEN      -
tcp6       0      0 localhost:6011          [::]:*                  LISTEN      -
udp        0      0 0.0.0.0:55515           0.0.0.0:*                           -
udp        0      0 0.0.0.0:mdns            0.0.0.0:*                           -
udp        0      0 localhost:323           0.0.0.0:*                           -
udp        0      0 0.0.0.0:952             0.0.0.0:*                           -
udp        0      0 0.0.0.0:bootps          0.0.0.0:*                           -
udp        0      0 0.0.0.0:sunrpc          0.0.0.0:*                           -
udp6       0      0 localhost:323           [::]:*                              -
udp6       0      0 [::]:952                [::]:*                              -
udp6       0      0 [::]:sunrpc             [::]:*                              -

dmesg (分析核心产生的讯息)

我们希望知道系统开机的时候某些硬件是否被系统加载到,但是系统开机过程中这些信息都是一闪而过,所以我们就可以使用dmesg 来查阅

[zhangshiyu@localhost ~]$ dmesg |more
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-1160.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct19 16:18:59 UTC 2020
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos
/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
[    0.000000] Disabled fast string operations
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003fedffff] usable
[    0.000000] BIOS-e820: [mem 0x000000003fee0000-0x000000003fefefff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000003feff000-0x000000003fefffff] ACPI NVS
[    0.000000] BIOS-e820: [mem 0x000000003ff00000-0x000000003fffffff] usable
[    0.000000] BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved
[    0.000000] NX (Execute Disable) protection: active
[    0.000000] SMBIOS 2.7 present.
[    0.000000] DMI: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 11/12/2020

同样的我们也可以使用这条命令查看我们磁盘是否成功加载,以及磁盘对应的文件系统格式

# 查询系统加载的sda磁盘的情况,匹配sda时忽略大小写
[zhangshiyu@localhost ~]$ dmesg |grep -i sda
[    3.199217] sd 0:0:0:0: [sda] 44040192 512-byte logical blocks: (22.5 GB/21.0 GiB)
[    3.199384] sd 0:0:0:0: [sda] Write Protect is off
[    3.199386] sd 0:0:0:0: [sda] Mode Sense: 61 00 00 00
[    3.199568] sd 0:0:0:0: [sda] Cache data unavailable
[    3.199570] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    3.201243]  sda: sda1 sda2
[    3.203114] sd 0:0:0:0: [sda] Attached SCSI disk
[    6.552787] XFS (sda1): Mounting V5 Filesystem
[    6.691573] XFS (sda1): Ending clean mount
[11355.991889] EXT4-fs (sda3): mounted filesystem with ordered data mode. Opts: (null)
[11356.366564] sda3: WRITE SAME failed. Manually zeroing.
[13245.141400] XFS (sda5): Mounting V5 Filesystem
[13245.153175] XFS (sda5): Ending clean mount
[14089.872450] XFS (sda5): Unmounting Filesystem
[14174.239242] XFS (sda5): Mounting V5 Filesystem
[14174.253655] XFS (sda5): Ending clean mount

vmstat (侦测系统资源变化)

[root@study ~]#  vmstat [ - a] [ 延 迟 [ [ 总计侦测 次 数 ]] <==CPU/内存等信息
[root@study ~]#  vmstat [ - fs] <==内存相关
[root@study ~]#  vmstat [ - S  单 位 ] <==设定显示数据的单位
[root@study ~]#  vmstat [- d] <==与磁盘有关
[root@study ~]#  vmstat [- p  分区 槽 ] <==与磁盘有关
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息;
-f :开机到目前为止,系统复制 (fork) 的进程数;
-s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明;
-S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量;
-d :列出磁盘的读写总量统计表
-p :后面列出分区槽,可显示该分区槽的读写总量统计表

基础使用

[zhangshiyu@localhost ~]$ vmstat
# r 等待运行的进程数量,不可被唤醒的进程数量,这两者越多就说明系统越忙碌
# memory:swpd   代表虚拟内存未被使用的数量,free表示内存未被使用的数量,buff用于缓冲区的内存数量,cache是用于缓存的内存总量
# swap:si由磁盘将进程读取的数量,so由于内存不足由swap分区写入磁盘的总量,若这两个值过大就说明数据经常在磁盘和内存来回切换,系统性能很差
# io bi 由磁盘读入的区块数量,bo将区块写入磁盘的数量,这两个值高则说明io频繁
# system:in被中断的进程数量 cs  每分钟进程切换的数量
# cpu  us 用户进程消耗cpu时间百分比 sy:系统进程消耗系统时间百分比  id 空闲时间占百分比 wa:等待io时间所占百分比 st:被虚拟机所占用的时间的百分比
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st1  0 162048  63024    360 222168    0    1    57     3   18   24  0  0 100  0  0

特殊文件与进程

具有SUID/SGID权限的指令执行状态

非root用户拥有passwd的执行权(即拥有suid权限),当非root用户执行passwd时,在这期间就会拥有passwd的root权限

如下我们使用非root用户键入passwd后按ctrl z +entrer

[zhangshiyu@localhost ~]$ passwd
Changing password for user zhangshiyu.
Changing password for zhangshiyu.
(current) UNIX password:[1]+  Stopped                 passwd

使用进程树命令,就可以印证上述所说

[zhangshiyu@localhost ~]$ pstree -uA
# 输出 可以看到sshd非root用户键入passwd之后短暂拥有root权限
-sshd---sshd(zhangshiyu)---bash-+-passwd(root)|                                       `-pstree

/proc/*代表的意义

进程被运行时就会被加载到内存中,而内存相关信息都会被写入到这个目录下

[zhangshiyu@localhost ~]$ ll /proc/
total 0
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:05 10
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:05 11
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:05 12
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1205
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1208
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1209
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1210
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1219
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:05 1222
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1225
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1226
dr-xr-xr-x.  9 root           root                         0 Jun 29 21:03 1228

我们都知道Linux第一个指令的指令就是systemd,如下命令可以看到这个文件夹中最重要的两个文件,一个cmdline代表这个进程所指向的指令川,另一个是environ代表这个进程的环境变量内容

[root@localhost zhangshiyu]# ll /proc/1/
total 0
dr-xr-xr-x. 2 root root 0 Jul  3 22:33 attr
-rw-r--r--. 1 root root 0 Jul  3 22:33 autogroup
-r--------. 1 root root 0 Jul  3 22:33 auxv
-r--r--r--. 1 root root 0 Jun 29 21:03 cgroup
--w-------. 1 root root 0 Jul  3 22:33 clear_refs
-r--r--r--. 1 root root 0 Jun 29 21:03 cmdline
-rw-r--r--. 1 root root 0 Jun 29 21:03 comm
-rw-r--r--. 1 root root 0 Jul  3 22:33 coredump_filter
-r--r--r--. 1 root root 0 Jul  3 22:33 cpuset
lrwxrwxrwx. 1 root root 0 Jul  3 22:33 cwd -> /
-r--------. 1 root root 0 Jun 29 21:03 environ
lrwxrwxrwx. 1 root root 0 Jun 29 21:03 exe -> /usr/lib/systemd/systemd
dr-x------. 2 root root 0 Jul  3 22:33 fd
dr-x------. 2 root root 0 Jul  3 22:33 fdinfo
-rw-r--r--. 1 root root 0 Jul  3 22:33 gid_map
-r--------. 1 root root 0 Jul  3 22:33 io
-r--r--r--. 1 root root 0 Jul  3 22:33 limits
-rw-r--r--. 1 root root 0 Jun 29 21:03 loginuid
dr-x------. 2 root root 0 Jul  3 22:33 map_files
-r--r--r--. 1 root root 0 Jul  3 22:33 maps
-rw-------. 1 root root 0 Jul  3 22:33 mem
-r--r--r--. 1 root root 0 Jun 29 21:03 mountinfo
-r--r--r--. 1 root root 0 Jul  3 22:33 mounts
-r--------. 1 root root 0 Jul  3 22:33 mountstats

具体内容我们可以使用cat进行查看

[root@localhost zhangshiyu]# cat /proc/1/cmdline
# 可以看到执行的指令确实是systemd,Linux执行的第一个命令得以印证
/usr/lib/systemd/systemd--switched-root--system--deserialize22

更多配置文件内容可参考下表

在这里插入图片描述

查询已开启文件或者一致性进程开启的文件

fuser (查看某目录下正在使用该目录的进程)

如果我们想查看当前目录下,我们开启了多少个文件,就可以使用这条命令

[root@study ~]#  fuser [- umv] [- k [i] [- signal]] file/dir
选项与参数:
-u :除了进程的 PID 之外,同时列出该进程的拥有者;
-m :后面接的那个档名会主动的上提到该文件系统的最顶层,对 umount 不成功很有效!
-v :可以列出每个文件与进程还有指令的完整相关性!
-k :找出使用该文件/目录的 PID ,并试图以 SIGKILL 这个讯号给予该 PID;
-i :必须与 -k 配合,在删除 PID 之前会先询问使用者意愿!
-signal:例如 -1 -15 等等,若不加的话,预设是 SIGKILL (-9) 啰!
[root@localhost zhangshiyu]# fuser -uv .# 这里重点介绍一下ACCESS 
#  c :此进程在当前的目录下(非次目录);
#   e :可被触发为执行状态;
#    f :是一个被开启的文件;
#  r :代表顶层目录 (root directory);
#   F :该文件被开启了,不过在等待回应中;
#   m :可能为分享的动态函式库;
#USER        PID ACCESS COMMAND
/home/zhangshiyu:    zhangshiyu   7112 ..c.. (zhangshiyu)bashzhangshiyu   7143 ..c.. (zhangshiyu)sftp-serverroot       8447 ..c.. (root)passwdroot       8515 ..c.. (root)bash

看看proc文件夹下运行的文件


[root@localhost zhangshiyu]# fuser -uv /proc/USER        PID ACCESS COMMAND
/proc:               root     kernel mount (root)/procrtkit       783 .rc.. (rtkit)rtkit-daemon[root@localhost zhangshiyu]# fuser -muv /proc/USER        PID ACCESS COMMAND
/proc:               root     kernel mount (root)/procroot          1 f.... (root)systemdroot        537 f.... (root)systemd-journalrtkit       783 .rc.. (rtkit)rtkit-daemonroot        786 f.... (root)udisksdroot        944 f.... (root)NetworkManagerroot       1219 F.... (root)libvirtdroot       1618 F.... (root)Xroot       1790 f.... (root)packagekitdroot       2267 f.... (root)gvfs-udisks2-voroot       2368 f.... (root)gsd-housekeepinroot       2442 f.... (root)gvfsd-trash
# 输出使用到home这个进程的pid
[root@localhost zhangshiyu]# echo $$
8515
# 进入home目录查看,果然有一个8515的进程在使用这个文件夹
[root@localhost zhangshiyu]# cd /home/
[root@localhost home]# fuser -uv .USER        PID ACCESS COMMAND
/home:               root       8515 ..c.. (root)bash

这时候我们就可以使用fuser进程尝试卸载,这也说明fuser这条指令常用于卸载那些挂载且正在使用中的文件系统


[root@localhost home]# umount /home/
umount: /home/: not mounted
[root@localhost home]# fuser -mki /home/
/home:                   1rce     2rc     4rc     6rc     7rc     8rc     9rc    10rc    11rc    12rc    13rc    14rc    16rc    17rc    18rc    19rc    21rc    22rc    23rc    24rc    26rc    27rc    28rc    29rc    31rc    32rc    33rc    34rc    36rc    39rc    40rc    41rc    42rc    43rc    44rc    45rc    46rc    47rc    48rc    49rc    55rc    56rc    57rc    58rc    66rc    68rc    69rc    71rc    73rc    86rc   123rc   318rc   319rc   322rc   326rc   329rc   330rc   332rc   333rc   334rc   335rc   338rc   339rc   416rc   417rc   428rc   429rc   442rc   443rc   444rc   445rc   446rc   447rc   448rc   449rc   450rc   451rc   452rc   453rc   537rce   568rce   579rce   699rc   700rc   701rc   702rc   703rc   704rc   705rc   706rc   714rc   748rce   750rce   752rce   754rc   755rc   777rce   778rce   779rce   781rce   782rce   783e   784rce   786rce   787rce   792rce   793rce   795rce   797rce   798rce   804rce   810rce   812rce   815rce   846rce   849rce   853rce   856rce   861rce   883rce   891rce   905rc   944rce  1205rce  1208rce  1209rce  1210rce  1219rce  1222rc  1225rce  1226rce  1228rce  1434rce  1444rce  1545rce  1546rce  1616rc  1618rce  1703rce  1780rce  1785rce  1790rce  1871rce  1937rc  1974rce  1988rce  2005rce  2014rce  2015rce  2048rce  2052rce  2057rce  2138rce  2152rce  2157rce  2160rce  2189rce  2218rce  2222rce  2224rce  2227rce  2239rce  2244rce  2249rce  2255rce  2256rce  2265rce  2267rce  2280rce  2288rce  2294rce  2300rce  2305rce  2309rce  2310rce  2312rce  2313rce  2324rce  2327rce  2332rce  2335rce  2336rce  2339rce  2354rce  2361rce  2362rce  2364rce  2365rce  2368rce  2375rce  2377rce  2378rce  2400rce  2418rc  2423rce  2435rce  2442rce  2447rce  2459rce  2464rce  2465rce  2466rce  2475rce  2490rce  2493rce  2499rce  2502rce  2516rce  2524rce  2536rce  2541rce  2606rce  2612rce  2638rce  3411rc  3973rc  4876rc  5370rc  5371rc  5400rc  6036rc  6726rc  6767rc  6768rc  6769rc  6770rc  6771rc  6772rc  6773rc  6774rc  6863rc  6914rc  6915rc  6916rc  6918rc  6951rc  7026rc  7040rce  7103rce  7107rce  7110rce  7112rce  7136rce  7143rce  7382rc  7759rc  7828rc  8239rce  8447rce  8505rc  8506rce  8515rce  8556rc  8653rc  8715rc  8730rce
Kill process 1 ? (y/N) n
Kill process 2 ? (y/N) ^C

当然这条指令也同样适合用于文件

[root@localhost home]# find /run/ -type p
/run/dmeventd-client
/run/dmeventd-server
/run/systemd/inhibit/12.ref
/run/systemd/inhibit/11.ref
/run/systemd/inhibit/10.ref
/run/systemd/inhibit/8.ref
/run/systemd/inhibit/4.ref
/run/systemd/inhibit/2.ref
/run/systemd/inhibit/1.ref
/run/systemd/sessions/39.ref
/run/systemd/sessions/38.ref
/run/systemd/sessions/1.ref
/run/systemd/initctl/fifo[root@localhost home]# fuser -uv /run/systemd/inhibit/1.refUSER        PID ACCESS COMMAND
/run/systemd/inhibit/1.ref:root        804 F.... (root)ModemManagerroot        856 f.... (root)systemd-logind

lsof (查看进程使用了那些文件)

[root@study ~]#  lsof [- - aUu] [+d]
选项与参数:
-a :多项数据需要『同时成立』才显示出结果时!
-U :仅列出 Unix like 系统的 socket 文件类型;
-u :后面接 username,列出该使用者相关进程所开启的文件;
+d :后面接目录,亦即找出某个目录底下已经被开启的文件!

基础示例

[root@localhost home]# lsof# 可以看到systemd这个命令用到了根目录COMMAND    PID  TID           USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                root  cwd       DIR              253,0       251         64 /
systemd      1                root  rtd       DIR              253,0       251         64 /
systemd      1                root  txt       REG              253,0   1632776   17448437 /usr/lib/systemd/systemd
systemd      1                root  mem       REG              253,0     20064     153193 /usr/lib64/libuuid.so.1.3.0
systemd      1                root  mem       REG              253,0    265576     900547 /usr/lib64/libblkid.so.1.1.0
systemd      1                root  mem       REG              253,0     90248     153189 /usr/lib64/libz.so.1.2.7
systemd      1                root  mem       REG              253,0    157424     154974 /usr/lib64/liblzma.so.5.2.2
systemd      1                root  mem       REG              253,0     23968     154955 /usr/lib64/libcap-ng.so.0.0.0
systemd      1                root  mem       REG              253,0     19896     155185 /usr/lib64/libattr.so.1.1.0
systemd      1                root  mem       REG              253,0     19248     360823 /usr/lib64/libdl-2.17.so
systemd      1                root  mem       REG              253,0    402384     377014 /usr/lib64/libpcre.so.1.2.0
systemd      1                root  mem       REG              253,0   2156272     360817 /usr/lib64/libc-2.17.so
systemd      1                root  mem       REG              253,0    142144     360843 /usr/lib64/libpthread-2.17.so

查看root用户所开启的socket进程所用到的文件

[root@localhost home]# lsof -u root -a -U
COMMAND    PID USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd      1 root   12u  unix 0xffff9f5f79d7bb80      0t0 10584 /run/systemd/private
systemd      1 root   13u  unix 0xffff9f5f61628440      0t0 37290 /run/systemd/journal/stdout
systemd      1 root   15u  unix 0xffff9f5f6162ea40      0t0 37291 /run/systemd/journal/stdout
systemd      1 root   16u  unix 0xffff9f5f4c405d80      0t0 37294 /run/systemd/journal/stdout
systemd      1 root   17u  unix 0xffff9f5f4c400440      0t0 37295 /run/systemd/journal/stdout
systemd      1 root   18u  unix 0xffff9f5f4c404400      0t0 36160 /run/systemd/journal/stdout
systemd      1 root   21u  unix 0xffff9f5f7553b740      0t0 11980 /run/systemd/shutdownd
systemd      1 root   22u  unix 0xffff9f5f7553c840      0t0 11982 /run/lvm/lvmpolld.socket
systemd      1 root   23u  unix 0xffff9f5f758c8000      0t0  1416 /run/systemd/notify
systemd      1 root   25u  unix 0xffff9f5f758c8440      0t0  1418 /run/systemd/cgroups-agent
systemd      1 root   26u  unix 0xffff9f5f7553cc80      0t0 11988 /run/lvm/lvmetad.socket
systemd      1 root   28u  unix 0xffff9f5f758c8cc0      0t0  1433 /run/systemd/journal/stdout
systemd      1 root   29u  unix 0xffff9f5f758c9100      0t0  1436 /run/systemd/journal/socket
systemd      1 root   30u  unix 0xffff9f5f758c9540      0t0  1438 /dev/log
systemd      1 root   35u  unix 0xffff9f5f7553d0c0      0t0 12259 /run/udev/control
systemd      1 root   36u  unix 0xffff9f5f7553ee80      0t0 17498 socket

查看系统目前开启的硬件装置

[root@localhost home]# lsof +d /dev/
COMMAND    PID           USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
systemd      1           root    0u   CHR                1,3      0t0  1028 /dev/null
systemd      1           root    1u   CHR                1,3      0t0  1028 /dev/null
systemd      1           root    2u   CHR                1,3      0t0  1028 /dev/null
systemd      1           root   30u  unix 0xffff9f5f758c9540      0t0  1438 /dev/log
systemd      1           root   31r   CHR             10,235      0t0  1126 /dev/autofs
kdevtmpfs   38           root  cwd    DIR                0,5     3380  1025 /dev
kdevtmpfs   38           root  rtd    DIR                0,5     3380  1025 /dev

查看root用户使用bash时所用到的文件

[root@localhost home]# lsof -u root |grep bash
ksmtuned   891 root  txt       REG              253,0    964536   50414404 /usr/bin/bash
bash      8515 root  cwd       DIR              253,0        24   50331764 /home
bash      8515 root  rtd       DIR              253,0       251         64 /
bash      8515 root  txt       REG              253,0    964536   50414404 /usr/bin/bash
bash      8515 root  mem       REG              253,0     61560     360835 /usr/lib64/libnss_files-2.17.so
bash      8515 root  mem       REG              253,0 106172832     376961 /usr/lib/locale/locale-archive
bash      8515 root  mem       REG              253,0   2156272     360817 /usr/lib64/libc-2.17.so
bash      8515 root  mem       REG              253,0     19248     360823 /usr/lib64/libdl-2.17.so
bash      8515 root  mem       REG              253,0    174576     376997 /usr/lib64/libtinfo.so.5.9
bash      8515 root  mem       REG              253,0    163312     360810 /usr/lib64/ld-2.17.so
bash      8515 root  mem       REG              253,0     26970   16888728 /usr/lib64/gconv/gconv-modules.cache
bash      8515 root    0u      CHR              136,1       0t0          4 /dev/pts/1
bash      8515 root    1u      CHR              136,1       0t0          4 /dev/pts/1
bash      8515 root    2u      CHR              136,1       0t0          4 /dev/pts/1
bash      8515 root  255u      CHR              136,1       0t0          4 /dev/pts/1

pidof (找出某支正在执行的程序的 PID)

[root@study ~]#  pidof [- - sx] program_name
选项与参数:
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个进程的 PID

使用示例


[root@localhost home]# pidof systemd rsyslogd
# 可以看到pid分别是1 和1208
1 1208

参考文献

鸟哥的Linux私房菜

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/247681.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/C++ - 内存管理(C++)

堆栈 C中的栈和堆是用于存储变量和对象​​的两个主要内存区域。栈是一种自动分配和释放内存的区域&#xff0c;用于存储局部变量和函数调用的上下文。栈上的内存分配和释放是自动进行的&#xff0c;无需手动管理。堆是动态分配内存的区域&#xff0c;用于存储动态创建的对象和…

滴滴基于 Ray 的 XGBoost 大规模分布式训练实践

背景介绍 作为机器学习模型的核心代表&#xff0c;XGBoost 在滴滴众多策略算法业务场景中发挥着至关重要的作用。因此&#xff0c;保障并持续提升 XGBoost 模型的离线训练及在线推理稳定性一直是机器学习平台的重点工作。同时&#xff0c;面对多样化的业务场景定制需求和数据规…

go语言(十八)---- goroutine

一、goroutine package mainimport ("fmt""time" )func main() {//用go创建承载一个形参为空&#xff0c;返回值为空的一个函数go func() {defer fmt.Println("A.defer")func() {defer fmt.Println("B.defer")//退出当前goroutinefmt…

Markdown(2篇文章学会Markdown

目录 1.文章链接&#xff1a;2.markdown可以用来解决什么问题&#xff1a;小结&#xff1a; 1.文章链接&#xff1a; Markdown&#xff08;2篇文章学会Markdown第一篇 Markdown&#xff08;2篇文章学会Markdown第二篇 2.markdown可以用来解决什么问题&#xff1a; 格式化文…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

神经网络建立(结果可变)最小神经元

目录 介绍&#xff1a; 初始化&#xff1a; 建模: 预测&#xff1a; 改变结果&#xff1a; 介绍&#xff1a; 在深度学习中&#xff0c;神经元通常指的是人工神经元&#xff08;或感知器&#xff09;&#xff0c;它是深度神经网络中的基本单元。深度学习的神经元模拟了生…

【服务器GPT+MJ+GPTs】创建部署GPT+MJ+GPTs程序网站

目录 🌺【前言】 🌺【准备】 🌺【宝塔搭建GPT+MJ+GPTs】 🌼1. 给服务器添加端口 🌼2. 安装宝塔 🌼3. 安装Docker 🌼4. 安装ChatGPT程序 🌼5. 程序更新 🌼6. 修改端口 | 密码 🌼7. 绑定域名+申请SSL证书 🌺【前言】 相信大家都对openai的产品ch…

Kafka(九)跨集群数据镜像

目录 1 跨集群镜像的应用场景1.1 区域集群和中心集群1.2 高可用(HA)和灾备(DR)1.3 监管与合规1.4 云迁移1.5 聚合边缘集群的数据 2 多集群架构2.1 星型架构2.2 双活架构2.2 主备架构2.2.1 如何实现Kafka集群的故障转移2.2.1.1 故障转移包括的内容1. 灾难恢复计划2. 非计划内的故…

重写Sylar基于协程的服务器(0、搭建开发环境以及项目框架 || 下载编译简化版Sylar)

重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 前言 sylar是…

计网Lesson11 - 虚拟机网络环境及socket概述

文章目录 虚拟机的简述socket概述 虚拟机的简述 放张图在这&#xff0c;根本没明白是啥对啥&#xff0c;以后学了Linux再来吧 &#x1f626; socket概述 s o c k e t socket socket 是一种用于应用层的用户态与应用层以下的内核态交互的工具&#xff0c;本意为“插座”。 也就是…

网络协议与攻击模拟_08DHCP协议

技术学习要了解某项技术能干什么&#xff1f;它的详细内容&#xff1f;发展走向&#xff1f; 一、DHCP协议 1、DHCP基本概念 dhcp动态主机配置协议&#xff0c;广泛应用于局域网内部 主要是为客户机提供TCP/IP 参数&#xff08;IP地址、子网掩码、网关、DNS等&#xff09;…

YOLO 全面回顾:从最初的YOLOv1到最新的YOLOv8、YOLO-NAS,以及整合了 Transformers 的 YOLO

YOLO 全面回顾 综述评估指标YOLO v1YOLO v2YOLO v3YOLO v4YOLOv5 与 Scaled-YOLOv4 YOLORYOLOXYOLOv6YOLOv7DAMO-YOLOYOLOv8PP-YOLO, PP-YOLOv2, and PP-YOLOEYOLO-NASYOLO with Transformers 综述 论文&#xff1a;https://arxiv.org/pdf/2304.00501.pdf 代码&#xff1a;gi…

探索设计模式的魅力:深入了解适配器模式-优雅地解决接口不匹配问题

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 目录 一、引言 1. 概述 2. 为什么需要适配器模式 3. 本文的目的和结构 二、简价 1. 适配器模式的定义和特点 定义 特点 2. 适配器模式的作用和适用场景 作用 适用场景 3. 适配器模式与其他设计模式的比较 三、适配…

iOS 面试 Swift基础题

一、Swift 存储属性和计算属性比较&#xff1a; 存储型属性:用于存储一个常量或者变量 计算型属性: 计算性属性不直接存储值,而是用 get / set 来取值 和 赋值,可以操作其他属性的变化. 计算属性可以用于类、结构体和枚举&#xff0c;存储属性只能用于类和结构体。存储属性可…

认识产品经理 一个合格的产品经理 产品经理分类

目录 一.合格的产品经理 什么是产品 什么是产品经理 合格的产品经理 什么是产品&#xff1f;区别是&#xff1f; 什么是产品经理 合格的产品经理需要关注哪些核心问题&#xff1f; 二.产品经理分类 为什么会有不同类型 都有那些类型 根据不同类型的职责特点规划个人…

Mysql-InnoDB-数据落盘

概念 1 什么是脏页&#xff1f; 对于数据库中页的修改操作&#xff0c;则首先修改在缓冲区中的页&#xff0c;缓冲区中的页与磁盘中的页数据不一致&#xff0c;所以称缓冲区中的页为脏页。 2 脏页什么时候写入磁盘&#xff1f; 脏页以一定的频率将脏页刷新到磁盘上。页从缓冲区…

C/C++编码问题研究

文章目录 一、Unicode字符集与U8/U16/U32编码二、编码1. 占字节数2. ASCII、GB2312、GBK、GB18030 以及 UTF8 的关系3. BOM4. UTF-8的存储实现 三、编译器字符集设置1. GCC语法Example 2. MSVC语法Example 三、wchar_t五、编码转换函数六、代码 & 实践1. UTF8与UTF16、UTF3…

PDF标准详解(一)——PDF文档结构

已经很久没有写博客记录自己学到的一些东西了。但是在过去一年的时间中自己确实又学到了一些东西。一直攒着没有系统化成一篇篇的文章&#xff0c;所以今年的博客打算也是以去年学到的一系列内容为主。通过之前Vim系列教程的启发&#xff0c;我发现还是写一些系列文章对自己的帮…

HCIP寒假第8次作业

第一步把ipv4网络配通 [r1]int g0/0/0 [r1-GigabitEthernet0/0/0]ip add 12.1.1.1 24 [r1-GigabitEthernet0/0/0]int l0 [r1-LoopBack0]ip add 1.1.1.1 32 [r1]ospf 1 router-id 1.1.1.1 [r1-ospf-1]area 0 [r1-ospf-1-area-0.0.0.0]network 0.0.0.0 255.255.255.255[r2]int g…

静态分析Golang语言生成函数调用关系的利器——go-callvis

目录 升级go删除旧版本安装新版本配置环境变量载入环境修改当前环境修改之后进入的环境 分析安装go-callvis分析其他包总结 导出文件总结 清晰主体脉络总结 其他 参考资料 不同于之前分析C语言项目的工具&#xff0c;go-callvis还是很方便使用。只要把两项工作做好就能顺利的使…