Linux基础-进程管理

作者:

在

查看配置

cpu信息查看

[root@localhost ~]# lscpu
Architecture:                x86_64  #架构
  CPU op-mode(s):            32-bit, 64-bit  
  Address sizes:             45 bits physical, 48 bits virtual
  Byte Order:                Little Endian
CPU(s):                      2    # sockect(插槽)*core per socket * thread per core
  On-line CPU(s) list:       0,1
Vendor ID:                   GenuineIntel
  BIOS Vendor ID:            GenuineIntel
  Model name:                Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz  #cpu型号
    BIOS Model name:         Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz
    CPU family:              6
    Model:                   126
    Thread(s) per core:      1
    Core(s) per socket:      1
    Socket(s):               2
    Stepping:                5
    BogoMIPS:                2380.78
    Flags:                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb
                              rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqd
                             q ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm
                              abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid avx512f avx5
                             12dq rdseed adx smap avx512ifma clflushopt avx512cd sha_ni avx512bw avx512vl xsaveopt xsavec xgetbv1 xsaves arat avx512
                             vbmi umip pku ospke avx512_vbmi2 gfni vaes vpclmulqdq avx512_vnni avx512_bitalg avx512_vpopcntdq rdpid fsrm md_clear fl
                             ush_l1d arch_capabilities
Virtualization features:   #虚拟化
  Hypervisor vendor:         VMware
  Virtualization type:       full
Caches (sum of all):
  L1d:                       96 KiB (2 instances)
  L1i:                       64 KiB (2 instances)
  L2:                        1 MiB (2 instances)
  L3:                        12 MiB (2 instances)
NUMA:
  NUMA node(s):              1
  NUMA node0 CPU(s):         0,1
Vulnerabilities:
  Gather data sampling:      Unknown: Dependent on hypervisor status
  Indirect target selection: Mitigation; Aligned branch/return thunks
  Itlb multihit:             KVM: Mitigation: VMX unsupported
  L1tf:                      Not affected
  Mds:                       Not affected
  Meltdown:                  Not affected
  Mmio stale data:           Vulnerable: Clear CPU buffers attempted, no microcode; SMT Host state unknown
  Reg file data sampling:    Not affected
  Retbleed:                  Mitigation; Enhanced IBRS
  Spec rstack overflow:      Not affected
  Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:                Mitigation; Enhanced / Automatic IBRS; IBPB conditional; PBRSB-eIBRS SW sequence; BHI SW loop, KVM SW loop
  Srbds:                     Unknown: Dependent on hypervisor status
  Tsa:                       Not affected
  Tsx async abort:           Not affected

内存

[root@localhost ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           3.5Gi       501Mi       2.6Gi       9.0Mi       739Mi       3.0Gi
Swap:          3.9Gi          0B       3.9Gi

磁盘

[root@localhost ~]# df -Th
Filesystem           Type      Size  Used Avail Use% Mounted on
devtmpfs             devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs                tmpfs     1.8G     0  1.8G   0% /dev/shm
tmpfs                tmpfs     725M  9.1M  716M   2% /run
/dev/mapper/rlm-root xfs        37G  2.4G   35G   7% /
/dev/nvme0n1p1       xfs       960M  256M  705M  27% /boot
/dev/mapper/rlm-home xfs        19G  161M   18G   1% /home
tmpfs                tmpfs     363M     0  363M   0% /run/user/0 

内核信息

cat /etc/os-release
uname -a
hostnamectl

进程是什么

1.基本概念

​ ● 进程是运行中的程序

​ ● 程序是静态文件,保存在硬盘上

​ ● 进程是程序运行的实例,是动态的,保存在内存中。有生有死

[root@localhost ~]# file /bin/date    # 程序文件
/bin/date: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=1b8568b41767b3c81e4080e90838bfdb24ca2e90, for GNU/Linux 3.2.0, stripped
[root@localhost ~]# /bin/date         # 执行后产生进程
2026年 07月 08日 星期三 10:14:41 CST
[root@localhost ~]# ps aux | grep date   # 通过ps命令可以看到这个进程
root        1536  0.0  0.0 221696  2604 pts/0    S+   10:14   0:00 grep --color=auto date

2. pid/ppid/进程树

进程也是分父子关系的,子进程都由父进程创建出来的

pid:进程唯一识别号,类似身份证号

ppid:父进程唯一识别号

所有的进程的祖先是systemd(pid=1)的进程

[root@localhost ~]# echo $$    #查看当前shell进程号
1440
[root@localhost ~]# ps -ef | grep 1440    #查看当前shell父进程号
UID          PID    PPID  C STIME TTY          TIME CMD
root        1440    1439  0 10:13 pts/0    00:00:00 -bash
root        1542    1440  0 10:19 pts/0    00:00:00 ps -ef
root        1543    1440  0 10:19 pts/0    00:00:00 grep --color=auto 1440
[root@localhost ~]# pstree -p   #查看进程树,带上进程号
systemd(1)─┬─NetworkManager(909)─┬─{NetworkManager}(910)
           │                     └─{NetworkManager}(911)
           ├─agetty(930)
           ├─auditd(826)───{auditd}(827)
           ├─chronyd(862)
           ├─crond(928)
           ├─dbus-broker-lau(852)───dbus-broker(853)
           ├─firewalld(856)───{firewalld}(908)
           ├─irqbalance(857)───{irqbalance}(863)
           ├─rsyslogd(943)─┬─{rsyslogd}(967)
           │               └─{rsyslogd}(971)
           ├─sshd(917)─┬─sshd(1423)───sshd(1439)───bash(1440)───pstree(1546)
           │           └─sshd(1428)───sshd(1470)───sftp-server(1471)
           ├─systemd(1429)───(sd-pam)(1431)
           ├─systemd-journal(725)
           ├─systemd-logind(858)
           └─systemd-udevd(737)

查看进程号为1的进程

[root@localhost ~]# ps -p 1
    PID TTY          TIME CMD
      1 ?        00:00:01 systemd

3. 前台进程和守护进程

前台进程:绑定终端,关闭终端就没了,使用ps aux查看基础进程,tty列一般是有值的,比如(pts/0)

守护进程:独立运行,与终端无关,tty列一般是?,比如后续学到的各种服务都是守护进程状态运行,nginx,sshd等

image-20260721184305369

==总结==: 是的,在实际运维视角中,除了用户登录产生的bash交互进程和它的子进程之外,systemd下挂的其余长期后台进程,几乎全都是守护进程,并且绝大多数都可以用 systemctl管理。

Daemon 是“脱离终端控制、在后台长期运行、为系统提供特定服务”的进程。

进程查看和排查工具

1. ps aux

a:显示所有终端下的进程,包括其他用户的进程(而不只是当前终端的)。

u:以面向用户的格式输出,显示用户名、CPU 和内存使用率等详细字段。

x:显示没有控制终端的进程(即后台守护进程,如 systemd、nginx 等)。

0. top

是 Linux 的实时系统监测工具,主要监控 CPU、内存和进程这三块

image-20260721192736799

[root@localhost ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.2  0.4 108308 16556 ?        Ss   21:13   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 31
root           2  0.0  0.0      0     0 ?        S    21:13   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    21:13   0:00 [pool_workqueue_]

==总结==:

深入理解为什么linux和windows的程序互相跑不了

  • 二进制文件格式不同

image-20260721185645195

Linux 内核只认 ELF 格式,Windows 内核只认 PE 格式——它们各自按自己”看得懂”的方式去读二进制文件,读不懂就拒绝执行。这就是最根本、最直接的不兼容原因。


列参数解析见课件

下面先不学

2. stat常见状态码(目前遇不到)

3. STAT 状态码速查(最常遇到的几个)

R:正在运行或处于运行队列中(可运行)。

S:可中断的睡眠(等待某个事件完成,最常见)。

D:不可中断的睡眠(通常在等待 I/O,如磁盘读写,此时不能轻易 kill)。

Z:僵尸进程(子进程已退出,但父进程未回收,若大量堆积需处理)。

T:暂停或被跟踪(如按了 Ctrl+Z 暂停的任务)。

后缀附加符(如 S+、Ss):

+:前台进程组(在前端运行)。

s:会话领导者(通常为首进程)。

l:多线程进程。

3. 示例

# 造一个T状态
[root@rocky ~]# vim test.txt
# 按 Ctrl+Z
[root@rocky ~]# ps aux | grep vim       # STAT = T

# ⭐找CPU最高的10个进程(生产最常用)   -%cpu是根据cpu递减,不加-就是递增
[root@rocky ~]# ps aux --sort -%cpu | head -11

# ⭐找内存最高的10个进程 -rss是根据rss递减的意思,不加-就是递增
[root@rocky ~]# ps aux --sort -rss | head -11

# 以树形展示
[root@rocky ~]# ps auxf

# 自定义显示格式,知道就行,不作要求
[root@localhost ~]# ps -axo user,pid,ppid,%mem,%cpu,command --sort -%cpu
这个新人需要知道吗

image-20260721190116968

4. 查看进程pid的方式汇总

[root@localhost ~]# cat /run/sshd.pid 
[root@localhost ~]# ps -aux |grep sshd
[root@localhost ~]# pgrep -l sshd
[root@localhost ~]# pidof sshd

进程控制与实时监控

1. top命令

行关键字段怎么看
第1行load average1分钟/5分钟/15分钟负载,≈CPU核心数算正常
第2行Tasks(就相当于进程)重点关注 zombie 是不是0
第3行%Cpuus(应用占用)、wa(IO等待,高说明磁盘慢)
进程列表%CPU/%MEM/COMMAND⭐看谁占资源多

重点交互命令

按键功能
P⭐按CPU排序
M⭐按内存排序
c显示完整命令
q退出
s改刷新间隔

其他选项参考课件

示例见课件部分

2. kill命令

编号信号名作用使用场景
1SIGHUP重新加载配置改完配置文件不想重启
9SIGKILL强制终止⚠️最后手段
15SIGTERM优雅终止(默认)⭐首选!

==-15:礼貌请进程”下班”,进程可保存数据、释放资源==

-9:内核直接”拖走”,进程来不及善后,可能丢数据、产生僵尸

准则:能用-15就不用-9

# 示例
[root@rocky ~]# ping baidu.com > /dev/null &
[1] 12345
[root@rocky ~]# kill -15 12345      # 优雅终止
[root@rocky ~]# kill -9 12345       # 强制终止(-15杀不掉时用)

3. pkill批量杀

# kill是精准狙击(要PID),pkill是地毯式轰炸(按名字)
[root@rocky ~]# pkill ping                # 杀掉所有ping
[root@rocky ~]# pkill -u appuser          # 杀掉某用户所有进程
[root@rocky ~]# pkill -9 -t pts/1         # 踢掉某终端用户

其他示例见课件

进程优先级

进程调度策略

cls 显示值内核常量类型使用场景
TSSCHED_OTHER / SCHED_NORMAL普通(默认)绝大多数业务进程,CFS 完全公平调度
FFSCHED_FIFO实时(先入先出)必须立即完成且不主动让 CPU 的任务

nice和pr

Nice值:这是进程的“让行意愿”。Nice值越高(越“善良”),越主动给别人让出执行权;Nice值越低(越“霸道”),越爱插队,想着优先执行

PR值:这是内核的最终调度优先级。内核会根据CPU实时负载强行调整顺序,不是完全听nice值

pr和nice的关系

再调度策略为SCHED_NORMAL时,top命令中的PR和NI列一定满足以下公式

PR = 20 + NI

而PR值是回被内核动态调整的,如果想要看动态的值,使用ps命令查看pri列

# 这也是查看优先级常用命令
[root@192 ~]# ps -axo pid,command,nice,cls --sort=-nice  # -o参数定义列格式
    PID COMMAND                      NI CLS
     43 [khugepaged]                 19  TS
     42 [ksmd]                        5  TS
      1 /usr/lib/systemd/systemd --   0  TS
      2 [kthreadd]                    0  TS
      3 [pool_workque&ue_]             0  TS
     10 [kworker/u512:0-events_unbo   0  TS
     12 [kworker/u512:1-netns]        0  TS
     13 [rcu_tasks_kthre]             0  TS

调整正在运行的进程

#终端1
[root@192 ~]# vim
#终端2
[root@192 ~]# ps -axo command,pid,nice |grep vim
vim                           12648   0
grep --color=auto vim         12652   0
[root@192 ~]# renice -20 -p 12648
12648 (process ID) 旧优先级为 0,新优先级为 -20
[root@192 ~]# ps -axo command,pid,nice |grep vim
vim                           12648 -20
grep --color=auto vim         12656   0

调整正在运行的进程

#终端1
[root@192 ~]# vim
#终端2
[root@192 ~]# ps -axo command,pid,nice |grep vim
vim                           12648   0
grep --color=auto vim         12652   0
[root@192 ~]# renice -20 -p 12648
12648 (process ID) 旧优先级为 0,新优先级为 -20
[root@192 ~]# ps -axo command,pid,nice |grep vim
vim                           12648 -20
grep --color=auto vim         12656   0

启动时指定优先级

# 终端1
[root@192 ~]# nice -n 19 vim 
# 终端2
[root@192 ~]# ps -axo command,pid,nice |grep vim
vim                           12657  19
grep --color=auto vim         12661   0

实践部分

nice不要调成-20,可能会导致ssh都无法连上去

一般不会太关注nice,==nice只用作微调,因为大部分业务场景都容器化,cpu资源基本由cgroups来做限制==

后台管理

jobs

不能用作部署服务,终端关闭,任务会被终止

nohup

见课件示例

系统服务管理

定义见课件

[root@192 ~]# pstree -p
systemd(1)─┬─NetworkManager(907)─┬─{NetworkManager}(908)
           │                     └─{NetworkManager}(909)
           ├─auditd(823)───{auditd}(824)
           ├─chronyd(862)
           ├─crond(929)
           ├─dbus-broker-lau(853)───dbus-broker(854)
           ├─firewalld(857)───{firewalld}(906)
           ├─irqbalance(858)───{irqbalance}(863)
           ├─login(933)───bash(1432)
           ├─ping(12690)
           ├─rsyslogd(941)─┬─{rsyslogd}(970)
           │               └─{rsyslogd}(973)
           ├─sshd(922)─┬─sshd(12693)───sshd(12698)───bash(12700)───pstree(12786)
           │           └─sshd(12697)───sshd(12731)───sftp-server(12732)
           ├─systemd(1423)───(sd-pam)(1425)
           ├─systemd-journal(726)
           ├─systemd-logind(859)
           └─systemd-udevd(738)

核心命令

常用命令

systemctl start   name.service    # 启动
systemctl stop    name.service    # 停止
systemctl restart name.service    # 重启
systemctl reload  name.service    # ⭐重载配置(不停服)
systemctl status  name.service    # ⭐查看状态

开关机启动相关

systemctl enable  name.service    # ⭐开机自启
systemctl disable name.service    # 取消自启
systemctl is-enabled name.service # 检查是否自启

查看所有服务

systemctl list-units --type service --all      # 所有服务状态
systemctl list-unit-files --type service       # 查看是否开机自启