进程状态总结
子进程 退出 后 发送 exit 信号 给父进程
比如 shell 中执行 ls
shell 是个父进程, ls 是个子进程, 执行 ls的时候 shell 是不能跑的
子进程 执行 完成 之后, 退出时候 子进程 已经关闭或者 丢弃了他的资源,剩余部分叫做僵尸。
父进程清醒 之后 自己去清理 这个 子进程的资源,然后 自己去执行其他的业务逻辑
不需要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
|
开启定时任务
进程 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
作业控制 运行 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 &
|