目录
进程是已启动的可执行程序的运行中的实力。它由以下部分组成:已分配内存的地址空间、安全属性(爆款所有权凭据和特权)、程序代码的一个或多个执行线程、进程状态。通俗来讲,进程就是在系统发生的某一件事情。
一、进程
1.1、进程ID
每个新进程分配到一个唯一的进程D(PID)以满足跟踪和安全的需要,父级进程ID是PPID。通过对PID的管理,来实现对某个进程的管理。所有进程都是第一个系统进程的后代,在RHEL7里面,第一个系统进程是systemd。
1.2、列出进程
ps命令用于静态列出当前的进程,ps -ef 或 ps aux 或ps lax。top命令用于动态列出进程。
或者用命令 pstree以树状结构列出进程。
1.3、进程前后台
从特定终端窗口中读取输入和键盘生成的信号,这就是前台进程。后台进程是与该终端相关联的任何其他作业的成员,终端的后台进程无法从终端读取输入或接收键盘生成的中断,但是可以写入终端(输出到屏幕)。ps命令在TTY列中显示进程的控制终端的设备名称。某些进程(如系统守护进程)是由系统启动的,并不是从shell提示符启动的,这些进程没有控制终端,无法转至前台,这些进程的TTY列会显示一个问号“?”。
任何命令都可以在后台启动,只需要在命令结尾附加“&”符号即可。回显是作业编号和PID。
命令jobs可以查看后台作业。
fg命令和PID(%加上作业编号)将该作业转至前台。
要将前台进程发送到后台,按Ctrl+z暂停即可。该作业将立即置于后台并暂停。
bg命令和PID(%加上作业编号)可以启动在后台运行且已经暂停的进程。
我们以ping命令为例,执行ping server0 > a & 回显作业编号为1。打开另一个中断用tail -f a查看是否在ping。用ps aux | grep ping来查看后台ping的状态。用fg %1让ping转移到前台。Ctrl + z暂停并转移到后台,job查看后台作业,注意查看a文件是否还继续写入ping的回显。再用bg %1启动ping,注意查看a文件是否还继续写入ping的回显。
[root@server0 ~]# tail -f a
^C
[root@server0 ~]# ping server0 > a &
[1] 2201
[root@server0 ~]# ps aux | grep ping
root 2201 0.0 0.0 120700 1052 pts/1 S 11:31 0:00 ping server0
root 2211 0.0 0.0 112640 936 pts/1 S+ 11:31 0:00 grep --color=auto ping
[root@server0 ~]# fg %1
ping server0 > a
^Z
[1]+ Stopped ping server0 > a
[root@server0 ~]# ps aux | grep ping
root 2201 0.0 0.0 120700 1052 pts/1 T 11:31 0:00 ping server0
root 2213 0.0 0.0 112640 936 pts/1 R+ 11:32 0:00 grep --color=auto ping
[root@server0 ~]#
[root@server0 ~]# jobs
[1]+ Stopped ping server0 > a
[root@server0 ~]# bg %1
[1]+ ping server0 > a &
[root@server0 ~]# fg %1
ping server0 > a
^C[root@server0 ~]#
二、使用信号控制进程
信号是传递至进程的软件中断。系统管理员用于管理进程的基本信号如下,注意信号编号随硬件平台不同而有差别,但是名称和定义都已经标准化,使用时建议使用短名称而不是编号。这里列出的编号适用于x86。
信号编号 | 短名称 | 定义 | 目的 |
---|---|---|---|
1 | HUP | 挂起 | 用于报告终端控制进程的终止。 也用于请求进程重新初始化而不终止。 相当于systemctl reload sshd.service,优点:不会中断,进程号不会变。 |
2 | INT | 键盘中断 | 程序终止。通过Ctrl+c发送。 |
3 | QUIT | 键盘退出 | 程序终止,但生成进程转储。通过Ctrl+\发送。 |
9 | KILL | 中断、无法拦截 | 立即终止程序。一棒子打死! |
15(默认值) | TERM | 终止 | 立即程序终止。友好方式,允许自我清理。 |
18 | CONT | 继续 | 发送至进程使其恢复(若已经停止) |
19 | STOP | 停止、无法拦截 | 暂停进程。无法被拦截或处理。 |
20 | TSTP | 键盘停止 | 暂停进程,可以被拦截、忽略或处理。通过Ctrl+z发送。 |
用户可以向当前的前台进程发送信号,具体为暂停Ctrl+z、中止Ctrl+c、核心转储Ctrl+\。
用户向后台进程或另一个会话中的进程发送信号,需要使用信号发送命令。用户可以中断自己的进程,root特权可以终止其他人的进程。
kill命令根据ID向进程发送信号,用法是kill -signal PID 查看有多少种signal用kill -l。虽然命令名字叫kill,但是不是只能杀死进程,kill可以发送任何信号!
验证的方法也是 ping server0 > a &,然后查看一下后台的PID(本例PID是),然后tail -f a看进程是否进行。然后用kill -signal PID来控制后台进程的暂停、继续、终止。
[root@server0 ~]# ping server0 > a &
[1] 2586
[root@server0 ~]# 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
[root@server0 ~]# kill -SIGSTOP 2586
[root@server0 ~]# kill -SIGCONT 2586
[1]+ Stopped ping server0 > a
[root@server0 ~]# kill -SIGTERM 2586
[root@server0 ~]# kill -SIGCONT 2586
-bash: kill: (2586) - No such process
[1]+ Terminated ping server0 > a
三、以管理员身份注销用户(踢掉在线用户)
w命令可以查看当前登录系统的用户,以及他们积累的活动。通过TTY和FROM列确定用户的位置。
所有用户都有一个控制终端,其列为pts/N(在图形环境窗口(伪终端)中操作时),而通过系统控制台、替代控制台或其他直接连接的终端设备操作时则列为ttyN。使用 w -f 选项时,远程用户在FROM列中显示其连接系统名称。如图,共有3个终端以root身份登录server0和一个终端以student身份登录server0,就有了pts/0、pts/1、pts/2和tty1。还可以看到是什么时间登录、空闲多久、shell执行的是什么命令。
我们可以通过pgrep -l -u username来查看某个用户的进程。当不需要终端用户所有进程时,用w命令确定会话的控制终端,然后仅终端应用同一终端ID的进程。除非指定SIGLILL,否则会话首进程(bash)可以成功处理终止并保留,但其他会话进程被终止。
[root@server0 ~]# pgrep -l -u student
7921 sshd
7922 bash
7965 ping
[root@server0 ~]# w -u student
12:42:48 up 1:56, 3 users, load average: 0.01, 0.08, 0.12
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
student pts/1 12:41 40.00s 0.06s 0.02s ping server0 -c 100
[root@server0 ~]# pkill -t pts/1
[root@server0 ~]# pgrep -l -u student
7921 sshd
7922 bash
[root@server0 ~]# pkill -SIGKILL -t pts/1
[root@server0 ~]# pgrep -l -u student
[root@server0 ~]#
四、监控进程活动
4.1、负载平均值
查看有CPU的内核表示,可以求出CPU核数。uptime命令可以显示负载平均值。将显示的负载平均值初一系统中逻辑CPU数(核数)。值低于1表示资源利用率较好,等待时间短。值高于1表示资源饱和,有一定的服务等待时间。
[root@server0 ~]# grep "model name" /proc/cpuinfo
model name : QEMU Virtual CPU version 1.5.3
[root@server0 ~]# grep "model name" /proc/cpuinfo | wc -l
1
[root@server0 ~]# uptime
14:15:40 up 1:22, 2 users, load average: 0.00, 0.01, 0.05
4.2、实时进程监控
top是系统进程的动态视图。默认输出列可以从其他资源工具识别:
- 进程ID(PID)
- 用户名称(USER)
- 虚拟内存(VIRT对应ps命令的VSZ)
- 常驻内存(RES对应ps命令的RSS)
- 进程状态(S,D=不可中断睡眠,R=运行中或可运行,S=睡眠中,T=已停止,Z=僵停)
- CPU时间(TIME)
- 进程命令名称(COMMAND)
top命令中还可以继续输入命令来操作
按键 | 目的 |
---|---|
?或 h | 交互式击键操作的帮助。 |
l、t、m | 切换到负载、线程、内存标题行。 |
s | 更改刷新率,以带小数的秒表示(如0.5、1、2.6)。安全模式下不可用 |
b | 切换方向突出显示运行中的进程;默认仅为粗体。 |
B | 在显示中使用粗体,用于标题以及运行中的进程。 |
H | 切换线程;显示进程摘要或单独线程。 |
u、U | 过滤用户名。 |
M | 按照内存使用率,以降序方式对进程列表排序。 |
P | 按照处理器使用率,,以降序方式对进程列表排序。 |
k | 中断进程。若有提示,输入PID,再输入signal |
r | 调整进程的nice值。若有提示,输入PID,再输入nice_value。 |
W | 写入当前显示配置,以便在下一次启动top时使用。 |
q | 退出 |