进程状态总结

image-20211006124644849

子进程 退出 后 发送 exit 信号 给父进程

比如 shell 中执行 ls

shell 是个父进程, ls 是个子进程, 执行 ls的时候 shell 是不能跑的

子进程 执行 完成 之后, 退出时候 子进程 已经关闭或者 丢弃了他的资源,剩余部分叫做僵尸。

父进程清醒 之后 自己去清理 这个 子进程的资源,然后 自己去执行其他的业务逻辑

image-20211006130006558

不需要CPU 就是 sleeping 状态,sleep 可以 编程 runnable状态

USER:运行进程的用户 PID:进程ID %C:CpU占用率 %MEM:内存占用率 WSz:占用虚拟内存 占用实际内存驻留内存 TTY:进程运行的终端 STAT:进程状态 man ps (STATE) R 运行 S **可中断睡眼sleep ** D 不可中断睡 T 停止的进程 Z 僵尸进程 X 死掉的进程 Ss s进程的领导者,父进程 S< <优先级较高的进程 SN N优先级较低的进程 R+ +表示是前台的进程组 Sl 以线程的方式运行 START:进程的启动时间 TIME:进程占用CpU的总时间 COMMAND:进程文件,进程名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
ps -aux
# 以下列举部分 程序
root      3203  0.0 18.4 2574108 347224 ?      Sl   Sep12  26:11 java -jar blog-api-basic-backend2-controller-0.0.1-SNAProot      4879  0.0  0.1 155684  298
# 这个 springboot的 jar 就是 线程方式运行
root     13357  0.0  0.4 719452  8916 ?        Sl   Oct01   0:10 ./main2
root     18963  0.0  0.9 857836 18092 ?        Sl   Sep29   0:11 ./main
root     21686  0.0  0.7 721132 14296 ?        Sl   Sep26   0:39 ./main
# 这几个 golang的项目 也是线程运行

cat /run/sshd.pid
# 有些程序 可以在 run 目录下查看 PID
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@VM-0-7-centos ~]# pstree
systemd─┬─BT-Panel───2*[{BT-Panel}]
        ├─BT-Task───8*[{BT-Task}]
        ├─YDLive───6*[{YDLive}]
        ├─YDService───22*[{YDService}]
        ├─abrt-dbus───3*[{abrt-dbus}]
        ├─acpid
        ├─2*[agetty]
        ├─atd
        ├─auditd───{auditd}
        ├─barad_agent─┬─barad_agent
        │             └─barad_agent───2*[{barad_agent}]
        ├─containerd───8*[{containerd}]
        ├─crond
        ├─dbus-daemon
        ├─dhclient
        ├─dockerd───14*[{dockerd}]
        ├─fail2ban-server───6*[{fail2ban-server}]
        ├─firewalld───{firewalld}
        ├─java───23*[{java}]
        ├─jsvc───jsvc───25*[{jsvc}]
        ├─lsmd
        ├─lvmetad
        ├─main───6*[{main}]
        ├─main───8*[{main}]
        ├─main2───5*[{main2}]
        ├─master─┬─pickup
        │        └─qmgr
        ├─mysqld_safe───mysqld───40*[{mysqld}]
        ├─nginx───2*[nginx]
        ├─ntpd
        ├─php-fpm───5*[php-fpm]
        ├─polkitd───6*[{polkitd}]
        ├─pure-ftpd
        ├─rhsmcertd
        ├─rngd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sgagent───{sgagent}
        ├─sshd─┬─3*[sshd]
        │      ├─sshd───bash───pstree
        │      └─2*[sshd───bash]
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tmux─┬─12*[bash]
        │      └─bash───vi
        └─tuned───4*[{tuned}]

查看系统的信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@VM-0-7-centos ~]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                1
On-line CPU(s) list:   0
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz
Stepping:              3
CPU MHz:               2394.374
BogoMIPS:              4788.74
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
L3 cache:              28160K
NUMA node0 CPU(s):     0
# 这个 CPU 只有 1核

top查看进程

1
2
3
4
top -d 4
# 4秒刷新一次
KiB Mem :  1881996 total,
小数点移动 左6位,1.8G
1
2
3
4
5
6
7
[root@VM-0-7-centos ~]# ps -aux | grep blog
root      1201  0.0  0.0 112812   976 pts/4    R+   13:49   0:00 grep --color=auto blog
root      3203  0.0 18.2 2574108 344180 ?      Sl   Sep12  26:12 java -jar blog-api-basic-backend2-controller-0.0.1-SNAPSHOT.jar -Xms380M -Xmx380M -Xss2k --spring.profiles.active=prod
[root@VM-0-7-centos ~]# top -d 4  -p 3203
# 查看 springboot jar 的进程
[root@VM-0-7-centos ~]# top -d 1 -u root
# 查看 root 用户运行的进程

使用信号控制进程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Signal     Value     Comment
─────────────────────────────
SIGHUP        1      终端退出时,此终端内的进程都将被终止
SIGINT        2      中断进程,可被捕捉和忽略,几乎等同于sigterm,所以也会尽可能的释放执行clean-up,释放资源,保存状态等(CTRL+C)
SIGQUIT       3      从键盘发出杀死(终止)进程的信号

SIGKILL       9      强制杀死进程,该信号不可被捕捉和忽略,进程收到该信号后不会执行任何clean-up行为,所以资源不会释放,状态不会保存
SIGTERM      15      杀死(终止)进程,可被捕捉和忽略,几乎等同于sigint信号,会尽可能的释放执行clean-up,释放资源,保存状态等
SIGCHLD      17      当子进程中断或退出时,发送该信号告知父进程自己已完成,父进程收到信号将告知内核清理进程列表。所以该信号可以解除僵尸进
                     程,也可以让非正常退出的进程工作得以正常的clean-up,释放资源,保存状态等。
 
SIGSTOP      19      该信号是不可被捕捉和忽略的进程停止信息,收到信号后会进入stopped状态
SIGTSTP      20      该信号是可被忽略的进程停止信号(CTRL+Z) 相当于暂停进程
SIGCONT      18      发送此信号使得stopped进程进入running,该信号主要用于jobs,例如bg & fg 都会发送该信号。
                     可以直接发送此信号给stopped进程使其运行起来    
SIGUSR1      10      用户自定义信号1
SIGUSR2      12      用户自定义信号2 





[root@VM-0-7-centos ~]# 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

开启定时任务

1
crond

进程 nice值

我们可以通过ps -l看到当前正在运行的进程的详细信息其中

  • F:表示进程旗标,标识进程所拥有的权限,当我切换到root的时候为4表示拥有root权限,为1仅有fork()权限
  • R:表示进程当前的状态UID:拥有该进程用户的用户ID
    • R:当前正在运行(RUNNING)
    • S:睡眠(SLEEP)
    • D:不可中断
    • T:停止(STOP)
    • Z:僵尸进程(ZOMBIE)
  • PID:进程号
  • PPID:该进程父进程的进程好
  • C:CPU是用百分比
  • PRI:优先级
  • NI:nice值
  • ADDR/SZ/WCHAN:都与内存有关
  • TTY:登陆者的终端,和远程登陆脱不开干系
  • TIME:占用CPU时间
  • CMD:造成此进程的命令

Linux系统是抢占式的,什么概念呢,系统当前运行一个进程,但这个时候一个具有更高优先级的进程突然得到某种资源进入了就绪状态,然后他就来到cpu面前一脚踢开正在运行的进程(你奏凯,我先来)就抢夺了与CPU共度的美好时光。。。

CFS直接分配的不是时间片,而是CPU使用比,这个比例会收到nice值得影响,然后你懂,nice值低比重就高,nice高比重就低

**Q:**Linux使用的CFS调度器,决定抢占时机的就是上面说的CPU使用比,注意!反而CPU使用比低的新进程会立刻投入运行,CPU使用比高的新进程会延迟运行,为什么呢

作业控制 jobs

  • jobs
  • bg
  • fg

作业控制 运行 shell 可以 同时运行 多个 子进程

1
2
3
4
5
6
sleep  7000 &
# 后台运行
sleep 6000
# ctrl+ z  stopped 暂停
ps -aux | grep sleep
# 可以看到进程状态
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[root@VM-0-7-centos ~]# jobs
[root@VM-0-7-centos ~]# sleep 9000 &
[1] 18840
[root@VM-0-7-centos ~]# sleep 5600
^Z
[2]+  Stopped                 sleep 5600
[root@VM-0-7-centos ~]# jobs
[1]-  Running                 sleep 9000 &
[2]+  Stopped                 sleep 5600
[root@VM-0-7-centos ~]#
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[root@VM-0-7-centos ~]# jobs
[1]-  Running                 sleep 9000 &
[2]+  Stopped                 sleep 5600
[root@VM-0-7-centos ~]# fg
sleep 5600
^Z
[2]+  Stopped                 sleep 5600
[root@VM-0-7-centos ~]# bg
[2]+ sleep 5600 &
[root@VM-0-7-centos ~]# jobs
[1]-  Running                 sleep 9000 &
[2]+  Running                 sleep 5600 &
[root@VM-0-7-centos ~]# fg % 2
sleep 5600

kill  %2
# 杀死后台 为 2的 进程

(while:; do date; sleep 2; done) &> /dev/null &