linux
进程管理
文章目录
概述
通俗的讲程序是一个包含可以执行代码的静态的文件。进程是一个开始执行但是还没有结束的程序的实例。
当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。
进程的分类
按照进程的功能和运行的程序分类,进程可划分为两大类:
系统进程
- 可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。
用户进程
-
通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。
-
针对用户进程,又可以分为如下3类:
- 交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。
- 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
- 守护进程(
Daemon
):守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止,需要时运行于后台的进程。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd
进程,crond
进程等。
进程的状态
为了充分的利用资源,系统还对进程区分了不同的状态。
一般操作系统将进程分为五个状态:
- 新建:新建表示进程正在被创建。
- 运行:运行是进程正在运行。
- 阻塞:阻塞是进程正在等待某一个事件发生。
- 就绪:就绪是表示系统正在等待
CPU
来执行命令。 - 完成:完成表示进程已经结束了系统正在回收资源。
Linux上进程有5种状态,这5中状态可以与一般操作系统的状态对应起来:
- 运行:正在运行或在运行队列中等待。
- 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号。
- 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
- 僵死:进程已终止, 但进程描述符存在, 直到父进程调用
wait4()
系统调用后释放。 - 停止:进程收到
SIGSTOP
,SIGSTP
,SIGTIN
,SIGTOU
信号后停止运行运行。
进程ID与父子进程
一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。
为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。Linux系统中,进程ID(PID
)是区分不同进程的唯一标识。PPID
表示父进程。所有的进程都是PID
为1的init
进程的后代。内核在系统启动的最后阶段启动init
进程。
一般每个进程都会有父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但子进程关闭,父进程不一定终止。
僵尸进程
每个进程在结束后都会处于僵死状态,等待父进程将其释放资源,处于该状态的进程已经结束,但父进程还没有释放其系统资源。
由于某种原因,父进程在子进程退出前退出,则所有子进程就变成一个孤儿进程,拖没有相应处理机制,则孤儿进程会一直处于僵死状态,资源无法释放。这种僵死的孤儿进程即僵尸进程。
此时解决方法是在启动进程内找一个进程作为这些孤儿进程的父进程,或者直接让init
进程作为它们的父进程,进而释放孤儿进程占用的资源。
线程
线程在Linux中被称为轻量级的进程。
进程有独立的内存地址空间,线程没有。线程不能独立存在,线程由进程创建的。
进程的组成
一个进程包含内核中的一部分地址空间和一系列数据结构。其中地址空间是内核标记的一部分内存以供进程使用,而数据结构则用来纪录每个进程的具体信息。
-
最主要的进程信息包括:
-
进程的地址空间图
-
进程当前的状态(
sleeping
、stopped
、runnable
等) -
进程的执行优先级
-
进程调用的资源信息
-
进程打开的文件和网络端口信息
-
进程的信号掩码(指明哪种信号被屏蔽)
-
进程的属主
进程监控
ps
命令监控系统进程
ps
命令(Process Status
)用于显示当前进程的状态。
ps
命令有两种不同风格的语法规则:
- BSD形式,BSD形式的语法的选项前没有破折号,如:
ps aux
- UNIX/LINUX形式,Linux形式的语法的选项前有破折号,如:
ps -ef
在Linux系统上混合这两种语法是可以的。比如 “ps ax -f
”。这里主要讨论UNIX形式语法。
注意:"ps aux
“不等同于”ps -aux
"。比如"-u"用于显示用户的进程,但是"u"意味着显示具体信息。
ps
命令参数说明
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iB1ixZgG-1634717185322)(F:\note\v2-dbd9bcc464c77acabb7c1a907535bfd4_r.jpg)]
常用的 PS 命令选项组合:
ps aux
a 选项表示显示所有进程,x 选项表示同时显示没有控制终端的进程(TTY 显示为 ?),u 选项表示使用基于用户的信息输出格式
[root@fyh init.d]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 127964 6636 ? Ss Oct18 0:02 /usr/lib/systemd/systemd --switched-root --
root 2 0.0 0.0 0 0 ? S Oct18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Oct18 0:00 [kworker/0:0H]
其中带中括号的命令(如 [kthreadd
])并不是真正的命令而是内核线程。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EJPgQKWo-1634717185324)(F:\note\v2-4770c56026adb4758bb5168dc92337d6_r.jpg)]
查看系统中的每个进程。
[root@fyh init.d]# ps -A
PID TTY TIME CMD
1 ? 00:00:02 systemd
2 ? 00:00:00 kthreadd
4 ? 00:00:00 kworker/0:0H
5 ? 00:00:01 kworker/u256:0
6 ? 00:00:01 ksoftirqd/0
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
9 ? 00:00:04 rcu_sched
10 ? 00:00:00 lru-add-drain
11 ? 00:00:02 watchdog/0
12 ? 00:00:02 watchdog/1
13 ? 00:00:00 migration/1
14 ? 00:00:01 ksoftirqd/1
16 ? 00:00:00 kworker/1:0H
18 ? 00:00:00 kdevtmpfs
19 ? 00:00:00 netns
20 ? 00:00:00 khungtaskd
21 ? 00:00:00 writeback
22 ? 00:00:00 kintegrityd
显示所有进程信息,连同命令行。
[root@fyh init.d]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Oct18 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deseria
root 2 0 0 Oct18 ? 00:00:00 [kthreadd]
root 599 1 0 Oct18 ? 00:00:00 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid
root 600 1 0 Oct18 ? 00:00:07 /usr/sbin/NetworkManager --no-daemon
root 919 1 0 Oct18 ? 00:00:21 /usr/sbin/rsyslogd -n
root 921 1 0 Oct18 ? 00:00:39 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
root 922 1 0 Oct18 ? 00:00:00 /usr/sbin/sshd -D
mysql 957 1 0 Oct18 ? 00:04:51 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mys
root 1146 922 0 Oct18 ? 00:00:02 sshd: root@pts/0
ps
与grep
常用组合用法,查找特定进程。
[root@fyh init.d]# ps -ef |grep ssh
root 922 1 0 Oct18 ? 00:00:00 /usr/sbin/sshd -D
root 1146 922 0 Oct18 ? 00:00:02 sshd: root@pts/0
root 6814 1149 0 15:15 pts/0 00:00:00 grep --color=auto ssh
显示指定用户进程。
[root@fyh init.d]# ps -u root
PID TTY TIME CMD
1 ? 00:00:02 systemd
599 ? 00:00:00 firewalld
600 ? 00:00:07 NetworkManager
919 ? 00:00:21 rsyslogd
921 ? 00:00:39 tuned
922 ? 00:00:00 sshd
1146 ? 00:00:02 sshd
1149 pts/0 00:00:00 bash
将目前属于您自己这次登入的 PID
与相关信息列示出来。
[root@fyh init.d]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1149 1146 0 80 0 - 28920 do_wai pts/0 00:00:00 bash
0 R 0 6816 1149 0 80 0 - 38338 - pts/0 00:00:00 ps
列出类似程序树的程序显示
该条命令的结果可以看到如下树状的进程信息。
[root@fyh init.d]# ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 4 0 0 ? -1 S< 0 0:00 \_ [kworker/0:0H]
922 1146 1146 1146 ? -1 Ss 0 0:02 \_ sshd: root@pts/0
1146 1149 1149 1149 pts/0 6817 Ss 0 0:00 \_ -bash
1149 6817 6817 1149 pts/0 6817 R+ 0 0:00 \_ ps axjf
输出指定的字段。
[root@fyh init.d]# ps -o pid,ppid
PID PPID
1149 1146
6818 1149
按内存占用情况对进程排序
[root@fyh init.d]# ps auxw --sort=rss
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S Oct18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Oct18 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Oct18 0:01 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S Oct18 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Oct18 0:00 [rcu_bh]
在进行系统维护时,如果CPU负载突然增加,而又不知道是哪一个进程造成的
[root@fyh init.d]# ps auxw --sort=%cpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.6 127964 6636 ? Ss Oct18 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Oct18 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Oct18 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Oct18 0:01 [ksoftirqd/0]
root 7 0.0 0.0 0 0 ? S Oct18 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S Oct18 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S Oct18 0:04 [rcu_sched]
root 10 0.0 0.0 0 0 ? S< Oct18 0:00 [lru-add-drain]
root 11 0.0 0.0 0 0 ? S Oct18 0:02 [watchdog/0]
root 12 0.0 0.0 0 0 ? S Oct18 0:02 [watchdog/1]
root 13 0.0 0.0 0 0 ? S Oct18 0:00 [migration/1]
root 14 0.0 0.0 0 0 ? S Oct18 0:01 [ksoftirqd/1]
pstree
命令监控系统进程
该命令显示当前运行的所有进程及其相关的子进程,以树的格式输出。
基本格式:pstree 参数
说明:pestree命令对程序名称相同的会自动合并,所有“|-httpd---8*[httpd]”即表示系统中有8个httpd进程产生的子进程。
参数:
-a :显示出该命令的参数,假如这个命令进程被其他进程替换掉,那么进程将显示在括号中 -a 选项包含有压实进程树的选项,对于相同的进程,会使用n*(process)的形式展显出来。
-c :关闭禁用显示结果进程树,在默认情况下,进程子树是会被压缩的。不管有多少进程名相同的进程,都会逐个显示出来。
-G :使用vt100线性描述树
-h :突空出显示当前进程的父进程并高亮显示出来,如果没有父进程那么什么都不会显示。
-H :突出显示出指定进程的父进程信息并高亮显示出来,使用方法为 pstree -H PID
-l :显示长格式命令选项,在默认的情况下,命令行最多显示宽度为132bit ,超过将不能正常显示。
-n :基于进程相同的祖先来进行排序,可以命名pid来代替进程名称 。
-p :显示所有的时程,显示结果包含进程名和时进程ID
-u :显示出用户的UID,无论何时,这个UID和进程比较UID参数,这个新的UID将在进程名后显示不同的参数。
-U :使用utf-8字符集以十进制表示,
-v :显示版本号。
基本pstree命令的使用。
[root@fyh init.d]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}] # systemd是所有进程的父进程
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─mysqld───26*[{mysqld}]
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree # 这条就是我刚刚输入的pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
显示当前所有进程的进程号和进程ID。
[root@fyh init.d]# pstree -p
systemd(1)─┬─NetworkManager(600)─┬─{NetworkManager}(618)
│ └─{NetworkManager}(620)
├─agetty(588)
├─auditd(552)───{auditd}(553)
├─crond(586)
├─dbus-daemon(576)───{dbus-daemon}(577)
├─firewalld(599)───{firewalld}(746)
├─irqbalance(574)
├─mysqld(957)─┬─{mysqld}(1098)
│ ├─{mysqld}(1109)
│ ├─{mysqld}(1110)
│ ├─{mysqld}(1111)
显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示。
[root@fyh init.d]# pstree -a
systemd --switched-root --system --deserialize 22
├─NetworkManager --no-daemon
│ └─2*[{NetworkManager}]
├─agetty --noclear tty1 linux
├─auditd
│ └─{auditd}
├─crond -n
├─dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
│ └─{dbus-daemon}
├─firewalld -Es /usr/sbin/firewalld --nofork --nopid
│ └─{firewalld}
├─irqbalance --foreground
├─mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
│ └─26*[{mysqld}]
├─polkitd --no-debug
│ └─6*[{polkitd}]
├─rsyslogd -n
│ └─2*[{rsyslogd}]
├─sshd -D
│ └─sshd
│ └─bash
│ └─pstree -a
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned -Es /usr/sbin/tuned -l -P
└─4*[{tuned}]
top命令监控系统进程
top命令可以动态管理监控linux
进程,非常类似于Windows任务管理器。top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要。但是,它的缺点是会消耗一定的系统资源。
[root@fyh init.d]# top
top - 15:28:58 up 2 days, 4:10, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 103 total, 1 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 995776 total, 179944 free, 373024 used, 442808 buff/cache
KiB Swap: 2097148 total, 2096884 free, 264 used. 460044 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6829 root 20 0 0 0 0 S 0.3 0.0 0:00.02 kworker/0:2
1 root 20 0 127964 6636 4132 S 0.0 0.7 0:02.34 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:01.40 ksoftirqd/0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:04.19 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
top命令基础界面详解
第一行:任务队列信息
15:28:58 当前时间
up 2 days, 4:10 系统运行时间。2天,4小时10分钟。
1 user 当前登录用户数。
load average: 0.00, 0.01, 0.05 系统负载,即任务队列的平均长度。 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。
第二行:进程数信息
103 total 进程总数
1 running 正在运行的进程数
102 sleeping 睡眠的进程数
0 stopped 停止的进程数
0 zombie 僵尸进程数
第三行:CPU状态
0.0% us 用户进程占用CPU百分比。
0.2% sy 系统进程占用CPU百分比。
0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比。
99.8% id 空闲CPU百分比。
0.0% wa IO等待占用CPU的百分比
0.0% hi 硬中断(Hardware IRQ)占用CPU的百分比
0.0% si 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态
995776k total 物理内存总量
179944k free 空闲内存总量
373024k used 使用的物理内存总量
442808k buffers 用作内核缓存的内存量
第五行:swap交换状态
2097148k total 交换区总量。
2096884k free 空闲交换区总量。
264k used 使用的交换区总量。
460044k cached 缓冲的交换区总量。
第六行:空行
第七行以下:各进程的状态监控
PID 进程id
PPID 父进程id
RUSER Real user name
UID 进程所有者的用户id
USER 进程所有者的用户名
GROUP 进程所有者的组名
TTY 启动进程的终端名。不是从终端启动的进程则显示为 ?
PR 优先级
NI nice值。负值表示高优先级,正值表示低优先级。
P 最后使用的CPU,仅在多CPU环境下有意义
%CPU 上次更新到现在的CPU时间占用百分比
TIME 进程使用的CPU时间总计,单位秒
TIME+ 进程使用的CPU时间总计,单位1/100秒
%MEM 进程使用的物理内存百分比
VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。
RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
CODE 可执行代码占用的物理内存大小,单位kb
DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb
SHR 共享内存大小,单位kb
nFLT 页面错误次数
nDRT 最后一次写入到现在,被修改过的页面数。
S 进程状态。
D=不可中断的睡眠状态
R=运行
S=睡眠
T=跟踪/停止
Z=僵尸进程
COMMAND 命令名/命令行
WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名
Flags 任务标志,参考 sched.h
top命令参数
b:以批量模式运行,但不能接受命令行输入;
c:显示命令行,而不仅仅是命令名;
d:显示两次刷新时间的间隔,比如 -d 5,表示两次刷新间隔为5秒;
i:不显示空闲进程和僵尸进程;
n:更新的次数,完成后退出top。比如 -n 5,表示top更新5次数据就退出;
p:参数为PID,仅监视指定进程的ID;PID是一个数值;
q:不经任何延时就刷新;
s:安全模式运行,禁用一些效互指令;
S:累积模式,输出每个进程的总的CPU时间,包括已死的子进程;
设置top命令10秒刷新一次。
[root@fyh ~]# top -d 10
显示程序及其完整相关信息
[root@fyh ~]# top -c
设定监控信息的更新次数。如设定系统任务信息更新5次后结束top命令,在命令行提示符下输入:
[root@fyh ~]# top -n5
top命令的操作
在top命令使用过程中,还可以使用一些交互的命令来完成其他参数的功能。
这些命令是通过以下快捷键启动(区分大小写):
- 空格:立刻刷新。
- h,?:显示有关安全模式及累积模式的帮助信息;
- i:禁止空闲进程和僵尸进程;
- l:切换到显法负载平均值和正常运行的时间等信息;
- m:显示/关闭内存信息;
- n:提示显示的进程数,比如输入3,就在整屏上显示3个进程;
- r:把renice 应用到一个进程,提示输入PID和renice的值;
- s:改变两次刷新时间间隔,以秒为单位;
- t:切换到显示进程和CPU状态的信息;
- k:提示输入要杀死的进程ID,目的是用来杀死该进程(默人信号为15)
- l:切换到显法负载平均值和正常运行的时间等信息;
- q:退出top命令。
- c:切换显示命令名称和完整命令行。
- f,F:增加显示字段,或删除显示字段;
- o,O:改变显示字段的顺序;
- P:根据CPU使用大小进行排序。
- T:根据累计时间排序。
- M:根据使用内存大小进行排序。
- W:将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。
- A:按进程生命大小进行排序,最新进程显示在最前;
- M:按内存占用大小排序,由大到小;
- N:以进程ID大小排序,由大到小;
- P:按CPU占用情况排序,由大到小
- S:切换到累积时间模式;
多U多核CPU监控
在top基本视图中,键入数字1,可监控每个逻辑CPU的状况:
lsof命令监控系统进程
lsof(list open files)是一个列出当前系统打开文件的工具。
在Linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof语法格式是:*lsof [options] filename*
命令参数:
-a:列出打开文件存在的进程。
-c<进程名> :列出指定进程所打开的文件。
-g:列出GID号进程详情。
-d<文件号>:列出占用该文件号的进程。
+d<目录> :列出目录下被打开的文件。
+D<目录> :递归列出目录下被打开的文件。
-n<目录> :列出使用NFS的文件。
-i<条件> :列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> :列出指定进程号所打开的文件。
-u :列出UID号进程详情。
-h :显示帮助信息。
-v :显示版本信息。
查看谁正在使用某个文件,也就是说查找某个文件相关的进程。
[root@fyh ~]# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1149 root txt REG 8,5 964600 16079 /usr/bin/bash
列出某个用户打开的文件信息。
[root@fyh ~]# lsof -u username
列出某个程序进程所打开的文件信息。
[root@fyh ~]# lsof -c bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1149 root cwd DIR 8,5 4096 201326657 /root
bash 1149 root rtd DIR 8,5 235 64 /
bash 1149 root txt REG 8,5 964600 16079 /usr/bin/bash
bash 1149 root mem REG 8,5 106176928 201391004 /usr/lib/locale/locale-archive
bash 1149 root mem REG 8,5 61560 67129320 /usr/lib64/libnss_files-2.17.so
bash 1149 root mem REG 8,5 2156352 67129264 /usr/lib64/libc-2.17.so
bash 1149 root mem REG 8,5 19248 67129271 /usr/lib64/libdl-2.17.so
bash 1149 root mem REG 8,5 174576 67169283 /usr/lib64/libtinfo.so.5.9
bash 1149 root mem REG 8,5 163312 67129257 /usr/lib64/ld-2.17.so
bash 1149 root mem REG 8,5 26970 67137382 /usr/lib64/gconv/gconv-modules.cache
bash 1149 root 0u CHR 136,0 0t0 3 /dev/pts/0
bash 1149 root 1u CHR 136,0 0t0 3 /dev/pts/0
bash 1149 root 2u CHR 136,0 0t0 3 /dev/pts/0
bash 1149 root 255u CHR 136,0 0t0 3 /dev/pts/0
列出多个进程多个打开的文件信息。
[root@fyh ~]# lsof -c mysql -c apache
列出除了某个用户外的被打开的文件信息
[root@fyh ~]# lsof -u ^root
列出多个进程号对应的文件信息。
[root@fyh ~]# lsof -p 1,2,3
列出除了某个进程号,其他进程号所打开的文件信息。
[root@fyh ~]# lsof -p ^1
列出所有的网络连接。
[root@fyh ~]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 922 root 3u IPv4 19335 0t0 TCP *:ssh (LISTEN)
sshd 922 root 4u IPv6 19337 0t0 TCP *:ssh (LISTEN)
mysqld 957 mysql 28u IPv6 19510 0t0 TCP *:mysql (LISTEN)
sshd 1146 root 3u IPv4 20525 0t0 TCP fyh:ssh->192.168.153.1:62611 (ESTABLISHED)
列出所有tcp 网络连接信息。
[root@fyh ~]# lsof -i tcp
列出所有udp网络连接信息。
[root@fyh ~]# lsof -i udp
列出谁在使用某个端口。
[root@fyh ~]# lsof -i :3306
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
mysqld 957 mysql 28u IPv6 19510 0t0 TCP *:mysql (LISTEN)
列出谁在使用某个特定的udp端口。
[root@fyh ~]# lsof -i udp:3306
列出谁在使用某个特定的tcp端口。
[root@fyh ~]# lsof -i tcp:3306
结束进程
信号
信号属于进程级别的中断请求。它们可以作为进程间通信的手段,或者由终端发送以杀死、中断、挂起某个进程。
常见信号列表:
# | name | Description | Default | Can catch? | Can block? | Dump core? |
---|---|---|---|---|---|---|
1 | HUP | Hangup | Terminate | Yes | Yes | No |
2 | INT | Interrupt(Ctrl +C) | Terminate | Yes | Yes | No |
3 | Quit | Quit(Ctrl +) | Terminate | Yes | Yes | Yes |
9 | KILL | Kill | Terminate | No | No | No |
BUS | Bus error | Terminate | Yes | Yes | Yes | |
11 | SEGV | Segmentation fault | Terminate | Yes | Yes | Yes |
15 | TERM | Software terminatation | Terminate | Yes | Yes | No |
STOP | Stop(Ctrl + Z) | stop | No | No | No | |
TSIP | Keyboard stop | stop | Yes | Yes | ||
CONT | Continue after stop | Ignore | Yes | No | No |
kill命令
kill 命令常用来终止某个进程,它可以向进程传递任意信号(默认为 TERM)。
kill [-signal] pid
不带任何数字(信号)选项的 kill 命令并不能保证指定进程被杀死,因为 kill 命令默认发送 TERM 信号,而 TERM 是可以被捕获、屏蔽或忽略的。
可以使用 kill -9 pid
命令强制杀死进程(9
代表 KILL 信号,不可被捕获、屏蔽或忽略)。
kill 命令需要指定进程的PID
号。
kill[参数][进程号]
命令参数:
-l :信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称。
-a :当处理当前进程时,不限制命令名和进程号的对应关系。
-p :指定kill 命令只打印相关进程的进程号,而不发送任何信号。
-s :指定发送信号。
-u :指定用户。
查询信号
[root@fyh ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略。 下面是常用的信号:
HUP 1 终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)
杀死指定用户所有进程
kill -9 $(ps -ef | grep peidalinux)
kill -u peidalinux
kill结束进程有些进程是无法杀死的。关键进程是无法结束的。比如bash的进程。
init
进程是无法被终止,或者说是不允。init
是Linux系统操作中不可缺少的程序之一。所谓的init
进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化 所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init
的方式,完成引导进程。所以,init
始终是第一个进程(其进程编号始终为 1)。 其它所有进程都是init
进程的子孙。init
进程是不可杀的!
killall命令
该命令用于结束指定名字的进程及其所有子进程。
结束mysql服务器的进程
[root@fyh ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─mysqld───26*[{mysqld}] # 可以看到mysql下面有26个子进程
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
[root@fyh ~]# killall mysqld
# 已经看不到mysql相关的进程了
[root@fyh ~]# pstree
systemd─┬─NetworkManager───2*[{NetworkManager}]
├─agetty
├─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─firewalld───{firewalld}
├─irqbalance
├─polkitd───6*[{polkitd}]
├─rsyslogd───2*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
└─tuned───4*[{tuned}]
若需要强制结束进程,与kill命令相似,可以使用 -9 ,例:killall
-9 mysql
本文摘取