linux进程管理


linux进程管理

@

目录

概述

通俗的讲程序是一个包含可以执行代码的静态的文件。进程是一个开始执行但是还没有结束的程序的实例。

当程序被系统调用到内存以后,系统会给程序分配一定的资源(内存,设备等等)然后进行一系列的复杂操作,使程序变成进程以供系统调用。

进程的分类

按照进程的功能和运行的程序分类,进程可划分为两大类:

系统进程

  • 可以执行内存资源分配和进程切换等管理工作,而且该进程的运行不受用户的干预,即使是root用户也不能干预系统进程的运行。

用户进程

  • 通过执行用户程序、应用程序或内核之外的系统程序而产生的进程,此类进程可以在用户的控制下运行或关闭。

  • 针对用户进程,又可以分为如下3类:

    1. 交互进程:由一个Shell终端其他的进程,在执行过程中,需要与用户进行交互操作,可以运行于前台,也可以运行于后台。
    2. 批处理进程:该进程是一个进程集合,负责按顺序启动其他的进程。
    3. 守护进程(Daemon):守护进程是一直运行的一种进程,经常在Linux系统时启动,在系统关闭时终止,需要时运行于后台的进程。它们独立于控制终端且周期性地质学某种任务或等待处理某些发生的时间。例,httpd进程,crond进程等。

进程的状态

为了充分的利用资源,系统还对进程区分了不同的状态。

一般操作系统将进程分为五个状态:

  • 新建:新建表示进程正在被创建。
  • 运行:运行是进程正在运行。
  • 阻塞:阻塞是进程正在等待某一个事件发生。
  • 就绪:就绪是表示系统正在等待CPU来执行命令。
  • 完成:完成表示进程已经结束了系统正在回收资源。

Linux上进程有5种状态,这5中状态可以与一般操作系统的状态对应起来:

  • 运行:正在运行或在运行队列中等待。
  • 中断:休眠中, 受阻, 在等待某个条件的形成或接受到信号。
  • 不可中断:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
  • 僵死:进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
  • 停止:进程收到SIGSTOP SIGSTPSIGTINSIGTOU信号后停止运行运行。

进程ID与父子进程

一个程序可能有许多进程,而每一个进程又可以有许多子进程。依次循环下去,而产生子孙进程。

为了区分各个不同的进程,系统给每一个进程分配了一个ID以便识别。Linux系统中,进程ID(PID)是区分不同进程的唯一标识。PPID表示父进程。所有的进程都是PID为1的init进程的后代。内核在系统启动的最后阶段启动init进程。

一般每个进程都会有父进程,父进程与子进程之间是管理与被管理的关系,当父进程停止时,子进程也随之消失,但子进程关闭,父进程不一定终止。

僵尸进程

每个进程在结束后都会处于僵死状态,等待父进程将其释放资源,处于该状态的进程已经结束,但父进程还没有释放其系统资源。

由于某种原因,父进程在子进程退出前退出,则所有子进程就变成一个孤儿进程,拖没有相应处理机制,则孤儿进程会一直处于僵死状态,资源无法释放。这种僵死的孤儿进程即僵尸进程。

此时解决方法是在启动进程内找一个进程作为这些孤儿进程的父进程,或者直接让init进程作为它们的父进程,进而释放孤儿进程占用的资源。

线程

线程在Linux中被称为轻量级的进程。

进程有独立的内存地址空间,线程没有。线程不能独立存在,线程由进程创建的。

进程的组成

一个进程包含内核中的一部分地址空间和一系列数据结构。其中地址空间是内核标记的一部分内存以供进程使用,而数据结构则用来纪录每个进程的具体信息。

  • 最主要的进程信息包括:

  • 进程的地址空间图

  • 进程当前的状态( sleepingstoppedrunnable 等)

  • 进程的执行优先级

  • 进程调用的资源信息

  • 进程打开的文件和网络端口信息

  • 进程的信号掩码(指明哪种信号被屏蔽)

  • 进程的属主

进程监控

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 命令选项组合:

  1. 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

psgrep 常用组合用法,查找特定进程。

[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

本文摘取

Linux进程管理 – LaplaceDemon – 博客园 (cnblogs.com)

Linux进程管理 – 知乎 (zhihu.com)

原创文章,作者:,如若转载,请注明出处:https://blog.ytso.com/278311.html

(0)
上一篇 2022年8月1日
下一篇 2022年8月1日

相关推荐

发表回复

登录后才能评论