什么是进程
在linux系统中,触发任何一个事件时,系统都会讲他定义成为一个进程。并且回给予这个进程一个ID,称为PID,同时根据出发这个进程的用户与相关属性关系,会给予这个进程一个一组有效的权限设置。
进程与程序
进程的产生
一般来说,执行一个程序或命令就可以触发一个事件而获取一个PID。
任务管理
了解任务管理
这个任务管理(jio control)是用在bash环境下的,也就是当我们登录系统获取bash shell之后,在单一终端下同时执行多个任务的操作管理。
什么是任务管理
执行任务管理操作中,其实每个任务都是目前bash的子进程,即彼此之间是有相关性的,我们无法用任务管理的方式有tty1的环境去管理tty2的bash。
假设我们只有一个终端,因此出现提示符让你操作的环境就成为前台(foreground),至于其他任务可以放在后台(background)去暂停或运行。注意,放入后台的任务想要运行时,他必须不能和用户交互。
总结
总之,要执行bash的任务管理必须要注意到的限制是:
1.这些任务所触发的进程必须来自于你的shell的子进程(只管理自己的bash)
2.前台:可以控制与执行米杠零的这个环境称为前台的服务(foreground)
3.后台:可以自动执行的任务,你无法使用[ctrl+c]终止它,可以使用bg,fg调用该任务
4.后台中执行的进程不能等待terminal或shell的输入(input),否则会一直等待。
job control的管理
bash只能够管理自己的任务而不能管理其他bash的任务,所以即使使用者为root也不能够将别的bash下的job拿过来执行。
后台的状态
在后台的任务状态可以分为`暂停(stop)`和`运行(running)`
实际执行job控制的命令
-
&
意义:将任务丢到后台执行,并返回到当前终端
用法:输入一个命令,在该命令的最后面加入一个&
(bash会给这个命令一个任务号码job number
,就是[1]
)
放入后台
[root@localhost test]# tar -zpcf lnmp.tarrr lnmp & [1] 2272 #[1]是job number 2272是pid [root@localhost test]# ls lnmp lnmp.tarrr lnmp.zip [1]+ Done #Done表示完成 tar -zpcf lnmp.tarrr lnmp
放入后台后仍会输出信息,但前台操作正常
[root@localhost test]# unzip lnmp.zip & [1] 2320 [root@localhost test]# Archive: lnmp.zip creating: lnmp/ creating: lnmp/lnmp/ inflating: lnmp/lnmp/alsa-lib-1.1.8-1.el7.x86_64.rpm inflating: lnmp/lnmp/apr-1.4.8-5.el7.x86_64.rpm inflating: lnmp/lnmp/apr-util-1.5.2-6.el7.x86_64.rpm inflating: lnmp/lnmp/libxcb-1.13-1.el7.x86_64.rpm [root@localhost test]# #可以发现这个操作放入后台仍会输出信息,但此时我们正常前台操作不会受影响 inflating: lnmp/lnmp/libXcomposite-0.4.4-4.1.el7.x86_64.rpm [1]+ Done unzip lnmp.zip
放入后台,不输出信息到前台
[root@localhost test]# unzip lnmp.zip > tar.txt & #我们可以使用重定向符号将输出的信息放入文件中,从而不在前台输出 [2] 2336 [root@localhost test]# ls lnmp lnmp.tarrr lnmp.zip tar.txt [2]- Done unzip lnmp.zip > tar.txt
-
crtl+z
意义:将目前的任务丢到后台中暂停
用法:直接按住ctrl+z[root@localhost test]# vim tar.txt [2]+ Stopped vim tar.txt
-
jobs
意义:查看目前的的后台任务状态
选项:选项 解释 -l 列出job number,命令串,和pid -r 仅列出正在后台run的任务 -s 仅列出在后台当中暂停(stop)的任务 用法:
查看当前后台任务状态
查看当前后台任务状态,列出job number,命令串,和pid[root@localhost test]# jobs [1]- Stopped unzip lnmp.zip > tar.txt [2]+ Stopped vim tar.txt
查看当前后台任务状态,仅列出正在后台run的任务[root@localhost test]# jobs -l [1]- 2330 Stopped (tty input) unzip lnmp.zip > tar.txt [2]+ 2352 Stopped vim tar.txt
查看当前后台任务状态,仅列出在后台当中暂停(stop)的任务[root@localhost test]# jobs -r [3] Done unzip lnmp.zip > tar.txt
(加号表示最近被放到后台的任务号码,-表示第二个被放置到后台的任务号码,而第三个及以后就不会有`+`,`-`的存在了)[root@localhost test]# jobs [1] Stopped unzip lnmp.zip > tar.txt [2]- Stopped vim tar.txt [3]+ Stopped vim a.txt
-
fg
意义:将后台的任务拿到前台来处理
选项:选项 解释 &jobnumber 取出job number为jobnumber的任务(%可有可无) 用法:
fg(默认取出+
任务)[root@localhost test]# fg vim tar.txt [2]+ Stopped vim tar.txt
fg %2(取出jobnumber是3的任务,%可有可无)
如果出现第二次取出的任务就是第一次取出的任务,可能是因为,你第一次取出之后挂后台,那么此时刚刚取出的就会变成+任务[root@localhost test]# fg %2 vim a.txt [2]+ Stopped vim a.txt
-
bg
意义:让任务在后台下的状态变成运行中
用法:
bg %jobnumber
让job number为jobnumber的任务变成运行中[root@localhost test]# jobs ;bg %4 ;jobs [1] Stopped vim a.txt [2] Stopped vim tar.txt [3]- Stopped find etc / > find.txt [4]+ Stopped find etc / > find.txt [4]+ find etc / > find.txt & [1] Stopped vim a.txt [2]- Stopped vim tar.txt [3]+ Stopped find etc / > find.txt [4] Running find etc / > find.txt &
-
kill
意义:管理后台当中的任务(一般来说,如果想要删除,重新启动任务的话需要发送信号signal
)
选项:选项 解释 -l 列出目前kill能够使用的信号(signal) 用法:
kill -signal %jobnumber
-signal代表要发送什么样的指示给后面的任务
signal选项:选项 解释 -1 重新读取一次参数的配置文件(类似于reload) -2 代表由键盘输入[ctrl+c]同样的操作 -9 立刻强制删除一个任务 -15 以正常的进程方式终止一项任务,与-9并不相同 [root@localhost test]# kill -9 %3;jobs [3]+ Stopped find etc / > find.txt [3]+ Killed find etc / > find.txt
注意:
一般来说,kill后面接的数字默认为pid,如果是job number,要记得加上%
-9和-15是不同的,比如要使用kill关掉一个vim任务,那么使用前者和后者的结果是不一样的。vim生成的.swp文件并不会删除,而后者正常关闭vim任务会删除.swp文件。
进程之间的通信方式
进程和进程的沟通方法有管道、信号、消息队列、共享内存、socket套接字等。Linux中默认使用信号进行通信
当进程接受到信号后,优先执行信号的操作;
信号的产生:内核产生;用户手动发送信号
发送信号:
根据进程id kill 工具
根据进程名 killall (会一并关闭所有的进程)结束一整个中断的进程
脱机管理
上面所做的放入后台的操作,其实指的是ctrl+c中断不了。而并不是真的放入了系统后台,比如,你是以远程连接的方式连接的主机,把任务&,放入后台,在任务未完成的情况下,你脱机了,任务不会继续进行,而会被中断。(如果想要脱机之后仍然可以执行任务,建议使用`at`,`nohup`)
管理进程
ps 查看静态进程
[root@localhost ~]# ps
PID TTY TIME CMD
2109 pts/0 00:00:00 bash
2132 pts/0 00:00:00 ps
ps默认只能查看当前终端
ps -l 仅查看自己的bash相关进程
[root@localhost test]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 2047 2046 0 80 0 - 58341 do_wai pts/0 00:00:00 bash
4 R 0 2701 2047 0 80 0 - 56375 - pts/0 00:00:00 ps
解释 | |
---|---|
F | 代表进程标识(process flags),说明这个进程的权限,常见号码:4:表示此进程权限为root ;1:表示此子进程仅执行一直(fork)而没有实际执行(exec) |
S | 代表这个进程的状态R(Running):该进程正在运行中 ;S(Sleep):该进程正在睡眠中(idle),但可以被唤醒(signal) ;D:不可被唤醒的睡眠状态 ;T(stop): ;Z(Zombie): |
UID/PID/PPID | 被uid所拥有/进程的PID号/此进城的父进程的PID |
C | 代表cpu的使用率,单位为% |
PRI/NI | 代表次进程被cpu所执行的优先级(数值越小越快执行) |
ADDR/SZ/WCHAN | 都和内存有关。 |
TTY | 得到终端的方式1.pts:表示为终端(远程ssh连接,图形化登录) ;2.tty(1-6):表示终端设备。tty2:表示有桌面 ;3.图形化的环境 ;4. ?:表示没有终端,是内核进程 |
TIME | 表示进程的持续时间 如果是00:00(一种可能,刚刚发起;另一种可能,持续的在进行) |
CMD | 运行的命令 |
扩展:
[root@localhost test]# w #查看当前系统有多少个用户在登陆
17:12:34 up 1:09, 2 users, load average: 0.00, 0.00, 0.00
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root tty2 16:03 1:09m 0.02s 0.02s /usr/libexec/gnome-session-binary
root pts/0 16:03 0.00s 0.71s 0.01s w
如果想要查看所有终端上的进程,则使用-a选项
选项
选项 | 解释 |
---|---|
-a | 查看所有终端执行的进程 |
-x | 查看不属于终端的进程 |
-u | 查看用户 |
-o | 指定选项 |
-e | 查看所有进程 |
-f | 查看用户PID PPID C(CPU资源占用) stime command |
--sort | 按照指定顺序排序[ps -aux --sort=(-[加这个减号代表按照从高到低排序])%cpu](默认是从低到高) |
eg:ps -ao user,%cpu,%men,command
[root@localhost ~]# ps -aux|head -n 5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 171628 15876 ? Ss 19:52 0:01 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
root 2 0.0 0.0 0 0 ? S 19:52 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 19:52 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 19:52 0:00 [rcu_par_gp]
[root@localhost ~]#
解释 | |
---|---|
USER | 用户 |
PID | PID |
%CPU | 占用的cpu的百分比 |
%MEM | 占用的内存的百分比 |
VSZ | 这个进程所占用的虚拟内存 |
RSS | 这个进程所占用的实际内存 |
TTY | 获取终端的方式 |
STAT | 状态(s 休眠) |
START | 进程开启的时间 |
TIME | 占用cpu的时间 |
COMMAND | 进程执行的命令 |
pstree
[root@localhost test]# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───3*[{accounts-daemon}]
├─alsactl
├─atd
├─auditd─┬─sedispatch
│ └─2*[{auditd}]
├─avahi-daemon───avahi-daemon
├─colord───3*[{colord}]
├─crond
├─cupsd
├─dbus-broker-lau───dbus-broker
├─firewalld───{firewalld}
├─gdm─┬─gdm-session-wor
│ ├─gdm-session-wor─┬─gdm-wayland-ses─┬─gnome-session-b───3*[{gnome-s+
│ │ │ └─2*[{gdm-wayland-ses}]
│ │ └─2*[{gdm-session-wor}]
│ └─2*[{gdm}]
├─gnome-keyring-d───3*[{gnome-keyring-d}]
├─irqbalance───{irqbalance}
├─lsmd
├─packagekitd───2*[{packagekitd}]
├─polkitd───5*[{polkitd}]
├─power-profiles-───2*[{power-profiles-}]
├─rhsm-service───{rhsm-service}
├─rhsmcertd
├─rsyslogd───2*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─sshd───sshd───sshd───bash───pstree
├─sssd_kcm
├─switcheroo-cont───2*[{switcheroo-cont}]
├─systemd─┬─(sd-pam)
│ ├─at-spi-bus-laun─┬─dbus-broker-lau───dbus-broker
│ │ └─3*[{at-spi-bus-laun}]
│ ├─at-spi2-registr───2*[{at-spi2-registr}]
│ ├─dbus-broker-lau───dbus-broker
│ ├─dconf-service───2*[{dconf-service}]
│ ├─evolution-addre───5*[{evolution-addre}]
│ ├─evolution-calen───8*[{evolution-calen}]
│ ├─evolution-sourc───3*[{evolution-sourc}]
│ ├─2*[gjs───4*[{gjs}]]
│ ├─gnome-session-b─┬─evolution-alarm───5*[{evolution-alarm}]
│ │ ├─gnome-software───3*[{gnome-software}]
│ │ ├─gsd-disk-utilit───2*[{gsd-disk-utilit}]
│ │ └─3*[{gnome-session-b}]
│ ├─gnome-session-c───{gnome-session-c}
│ ├─gnome-shell─┬─Xwayland
│ │ ├─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ │ ├─ibus-engine-sim───2*[{ibus-engine+
│ │ │ ├─ibus-extension-───3*[{ibus-extens+
│ │ │ └─2*[{ibus-daemon}]
│ │ └─13*[{gnome-shell}]
│ ├─gnome-shell-cal───5*[{gnome-shell-cal}]
│ ├─goa-daemon───3*[{goa-daemon}]
│ ├─goa-identity-se───3*[{goa-identity-se}]
│ ├─gsd-a11y-settin───3*[{gsd-a11y-settin}]
│ ├─gsd-color───3*[{gsd-color}]
│ ├─gsd-datetime───3*[{gsd-datetime}]
│ ├─gsd-housekeepin───3*[{gsd-housekeepin}]
│ ├─gsd-keyboard───3*[{gsd-keyboard}]
│ ├─gsd-media-keys───3*[{gsd-media-keys}]
│ ├─gsd-power───3*[{gsd-power}]
│ ├─gsd-print-notif───2*[{gsd-print-notif}]
│ ├─gsd-printer───2*[{gsd-printer}]
│ ├─gsd-rfkill───2*[{gsd-rfkill}]
│ ├─gsd-screensaver───2*[{gsd-screensaver}]
│ ├─gsd-sharing───3*[{gsd-sharing}]
│ ├─gsd-smartcard───5*[{gsd-smartcard}]
│ ├─gsd-sound───3*[{gsd-sound}]
│ ├─gsd-subman───3*[{gsd-subman}]
│ ├─gsd-usb-protect───3*[{gsd-usb-protect}]
│ ├─gsd-wacom───3*[{gsd-wacom}]
│ ├─gsd-xsettings───3*[{gsd-xsettings}]
│ ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
│ ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
│ ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
│ ├─gvfs-udisks2-vo───3*[{gvfs-udisks2-vo}]
│ ├─gvfsd───2*[{gvfsd}]
│ ├─gvfsd-fuse───5*[{gvfsd-fuse}]
│ ├─gvfsd-metadata───2*[{gvfsd-metadata}]
│ ├─ibus-portal───2*[{ibus-portal}]
│ ├─ibus-x11───2*[{ibus-x11}]
│ ├─vmtoolsd───3*[{vmtoolsd}]
│ └─xdg-permission-───2*[{xdg-permission-}]
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─udisksd───4*[{udisksd}]
├─upowerd───2*[{upowerd}]
├─vmtoolsd───3*[{vmtoolsd}]
├─vmware-vmblock-───2*[{vmware-vmblock-}]
└─wpa_supplicant
top 动态查看进程的变化
选项与参数
选项 | 结束 |
---|---|
-d | 接秒数,设置刷新的秒数 |
-b | 以批量的方式执行top,通常会搭配重定向来将批量的结果输出成文件 |
-n | 加数字与-b搭配,需要执行几次top的输出结果 |
-p | 指定某个pid来执行查看监测 |
top顶栏解释
[root@localhost test]# top|head
top - 20:32:21(开机时间) up 4:29(开机到现在所经过的时间), 2 users(已经登录系统的用户人数), load average: 0.01, 0.02, 0.00(系统在1.5.15分钟的,系统平均要负责运行几个进程(数字越小越闲置,高于1太频繁))
Tasks: 284 total (目前的进程总量), 1 running, 282 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st (显示的是cpu的整体负载)
MiB Mem : 3888.4 total, 1657.6 free, 1037.6 used, 1193.1 buff/cache (虚拟内存的使用情况)
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2536.2 avail Mem (物理内存的使用情况)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+(cpu的使用时间的累加) COMMAND
2744 root 20 0 226032 4296 3408 R 5.9 0.1 0:00.01 top
1 root 20 0 24200 15812 10476 S 0.0 0.4 0:01.43 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
top命令的交互模式(可以上下键移动)
参数 | 解释 |
---|---|
1 | 查看每个逻辑cpu的资源信息 |
M | 按照占用内存的百分比进行排序 |
m | 查看内存进度条模式的百分比 |
P | 按照cpu的百分比进行排序 |
c | 显示命令的名称 |
T | 根据占用时间进行排序 |
K | 杀死pid(顶栏下一行) |
q | 退出top命令 |
r | 给予某个pid重新制定一个nice值 |
举例
- 查看单一进程
[root@localhost test]# top -d 2 -p 2047
top - 20:44:09 up 4:41, 2 users, load average: 0.08, 0.02, 0.00
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us(用户空间占用cpu百分比.例如shell程序、开启的应用软件、桌面等), 0.0 sy(内核空间占用cpu百分比.例如系统分配内存、执行的IO操作等), 0.0 ni(用户自定义优先级的进程占用cpu百分比), 99.3 id(cpu的空闲百分比), 0.0 wa(等待磁盘IO操作的时间。时间越长,表示cpu和磁盘的性能差距越大,要检测是不是系统有非常的IO), 0.2 hi(硬中断.表示硬盘、网卡等硬件设备发送CPU的中断消息,CPU处理消), 0.2 si(软中断.表示软件发送CPU的中断消息,CPU处理消耗的时间
), 0.0 st(虚拟机等待cpu的时间.只有当系统是虚拟机的时候关注此项)
MiB Mem : 3888.4 total, 1657.2 free, 1038.1 used, 1193.1 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2535.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2047 root 20 0 233364 9724 6220 S 0.0 0.2 0:00.86 bash
- 将top的信息执行两次,输出到一个文件中保存
[root@localhost test]# top -b -n 2 > top.txt
[root@localhost test]# cat top.txt
top - 20:46:32 up 4:43, 2 users, load average: 0.00, 0.01, 0.00
Tasks: 284 total, 1 running, 282 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0
.......
pstree
[root@localhost test]# pstree
systemd─┬─ModemManager───3*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─accounts-daemon───3*[{accounts-daemon}]
├─alsactl
├─atd
├─auditd─┬─sedispatch
│ └─2*[{auditd}]
├─avahi-daemon───avahi-daemon
├─colord───3*[{colord}]
├─crond
.....
选项 | 解释 |
---|---|
-A | 各进程树之间的连接以ASCII字符来连接 |
-U | 各进程树之间的连接以Unicode字符来连接,在某些终端可能会报错 |
-p | 并同时列出pid |
-u | 同时列出所属账号名称 |
僵尸进程
- 如果是僵尸进程,一定要特别重视,会消耗系统的cpu 内存资源。
- 僵尸进程是指父进程排出子进程工作,但是收不到子进程发送来的信息,此时子进程会一直发送信息,成为僵尸进程,占用资源。
- 产生原因:程序bug或者人为故意放出病毒。
孤儿进程
- 如果是孤儿进程,不会占用系统的cpu 内存资源,PID为1的进程(systemd)会接管孤儿进程然后关闭它。
- 孤儿进程是指父进程退出后,子进程还在运行的进程。
- 产生原因:用户手动关闭父进程或者程序BUG导致父进程比子进程先退出
扩展命令
pgrep 通过信息查询进程(模糊查询)
选项
选项 | 解释 |
---|---|
-U | 通过用户名查找进程 |
-G | 通过用户组查找进程 |
-u | 通过uid查找进程 |
-g | 通过gid查找进程 |
-P | 通过父进程查找子进程 |
-l | 打印命令 |
-o | 如果有多个进程运行,则查找最早运行的进程 |
-n | 如果有多个进程运行,则查找最晚运行的进程eg:pgrep -n / -o vim |
-d | 指定分隔符(shell脚本中应用的较多)可以把过滤出来的进程根据分隔符进行分割 |
pidof 根据进程名称查询
pidof必须写全
pkill(ps和kill结合) 可以结束一个终端、一个用户的所有进程
pkill -t tty1 结束终端1下的进程
pkill -kill / -9 -t pts/2 踢用户
pkill -u 用户 结束指定用户的所有进程
pkill -9 vim 强制结束进程
进程的优先级
在系统繁忙的时候,高优先级的进程最优先分配CPU资源
优先级越高,进程越优先分配cpu资源
Linux进程中有两种优先级:
- PR 动态优先级(内核自动调整)
- NI 静态优先级(用户手动调整)
ni优先级的范围:-20~19 ;(数字越小,优先级越高;root用户才能修改ni值)
调整ni值
修改已经启动的ni值: renice -n 15 8004
在启动进程的时候调整ni值:nice -n -20 vim a