一:进程概述
1.1 什么是进程
要知道什么是进程,就要先知道程序是什么。简单来说,程序就是一系列可执行的代码。而当那一串代码被执行,即程序被运行,其所产生的就叫进程,一个程序可以创建一个或多个进程。简单说,进程就是动态执行的代码。是资源分配的最小单位
1.2 进程的分类
Linux 中 根据进程的特点,把进程可以分为三类:交互进程、批处理进程和守护进程。
(1) 交互进程:是由shell启动的进程,它既可以在前台运行,也可以在后台运行。
(2)批处理进程:和终端没有联系,是一个进程序列。该进程负责按照顺序启动其它进程。
(3)守护进程:是是执行特定功能或者执行系统相关任务的后台进程。
-
根据进程状态,可以分为 守护进程,孤儿进程,僵尸进程
-
(1)守护进程:没有控制终端,父进程都是init进程(PID为1)
-
(2)孤儿进程:父进程退出后,其子进程还在运行,这些子进程成为孤儿进程。孤儿进程将会被init(PID=1) 进程收养,有init进程对他们完成状态收集工作
-
(3)僵尸进程:当子进程比父进程先结束时,却又没有完全释放内存,该进程就成为僵尸进程。僵尸进程父进程结束后,僵尸进程就会被init进程收养,最终回收。
#孤儿进程不会导致资源浪费,但是,僵尸进程会导致资源浪费。
1.3 Linux 的 5中常见进程状态
linux有 5 中常见进程状态 运行 , 中断 ,不可中断 , 僵死, 停止
X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁。当进程在退出过程中,没有保留它的 task_struct ,此时就处于EXIT_DEAD。此状态非常短暂,几乎不可能被ps 命令捕捉
二: 统计进程信息
2.1 ps 命令 查看静态的进程统计信息
(1) ps aux
常用选项
a : 显示中断上的所有进程,包括其他用户的进程
u :列出进程的用户
x :显示所有终端的进程
字段解释:
USER : 启动进程的用户
PID : 进程的ID
%CPU : 进程占用的cpu 百分比
%MEM: 进程占用的内存百分比
VSZ : 进程占用的虚拟内存(KB)
RSS : 进程占用的物理内存(KB)
TTY : 启动进程的终端。不是从终端启动的则为?
STAT : 进程的状态。
(D :不可中断睡眠状态 ,S:可中断睡眠状态 ,R:可执行/运行状态 ,Z :僵死状态 ,T :停止转态或者追踪状态)
START: 进程被触发时间
TIME : 该进程实际使用cpu时间
COMMAND : 进程的启动命令
(2) ps -elf
-e :显示系统内的所有进程新型
-l : 长格式显示进程信息
-f : 使用完整的格式显示进程信息
-a : 显示所有进程的pid
-T : 查看线程的信息
#如果要查看线程的信息,可以使用 ps -aT 命令
字段解释:
F :内核分配给进程的系统标记
S : 进程的状态
UID : 启动进程的用户
PID :进程ID
PPID : 进程的父进程ID
C :进程生命周期的cpu利用率
PRI : 进程的优先级(数字越大,优先级越低)
NI : 谦让度值,用来参与决定优先级
ADDR :进程的内存地址
SZ : 所需交换空间大小
WCHAN :如果该进程睡眠,显示睡眠中的系统函数名
STIME :进程启动时的系统时间
TTY : 进程启动时的终端设备
TIME :进程占用的累计CPU时间
CMD :进程的启动命令
2.2 top 命令动态查看进程排名信息
top 命令 会进入一个交互界面,按下ctrl +c 或者 q 键 退出
第一行是:任务队列信息
10:40:49 ##系统时间
up 2:03 ##系统运行时长
1 user ##当前登录用户数
load average: 0.00 ,0.01 ,0.02
##系统负载,依次是 1分钟内,5分钟内,15 分钟内 到现在的平均值。一般该值最好小于 CPU总核心数*0.7
第二行:进程信息
Tasks #总进程数
running #正在运行的进程数
sleeping #休眠的进程数
stopped #中止的进程数
zombie #僵死的进程数
第三行:Cpu 信息 (显示的是所有cpu总和的信息。按 1 键,可以看到每个cpu的信息,按大写P 键可以按cpu 使用的降序排列)
us ##用户占用
sy ##系统占用
ni ##优先级调度占用
id ## 空闲cpu 占比
wa ## I/O 读写等待占用
hi ##硬件中断占用
si ##软件中断占用
st ##虚拟化占用
第四行: 内存的信息( 按下大写M ,根据使用内存大小 进行 降序排列)
total ##总内存空间
free ##空闲内存
used ##已使用内存
buff/cache ##物理内存和交换内存缓存区总和
第五行: 交换空间信息
total ##总交换空间大小
free ##空闲交换空间
used ##已使用交换空间
avail Mem ##可用物理内存大小
进程信息区各列解释
PID #进程id
USER #启动进程的用户
PR #优先级
NI #谦让度
RES #进程使用的虚拟内存总量(kb)
SHR #共享内存大小 (kb)
S #进程状态
%CPU #上次更新到现在cpu使用占比
%MEM #内存使用占比
TIME+ #进程使用的cpu时间总计,精确到 毫秒
COMMAND #启动进程的命令
top 交互界面常用操作
P 键: 根据CPU 降序排列
M 键:根据内存降序排列
N 键: 根据启动时间降序排列
c 键: 切换显示命令名称和完整命令行
h 键:可以获得top 程序的帮助信息
k 键: 根据提示输入进程的pid 号,按enter 键, 可以 终止 对应的进程
q 键: 退出top 交互界面
数字1 键: 显示 每个cpu 的状态
top -H : 显示所有线程
top -H -p : 显示特定进程中的线程
2.3 pgrep 查看特定进程信息
pgrep -l 显示进程名。如果没有,只显示PID号
其他选项:
-U : 指定特定用户
-G :指定特定组
-t :指定终端
-a : 列出完整的命令行
[root@localhost ~]# pgrep -l httpd #列出httpd 的进程
4284 httpd
4286 httpd
4287 httpd
4288 httpd
4289 httpd
4290 httpd
[root@localhost ~]# pgrep -l -U test #列出test 用户的进程,并显示进程名
4331 bash
4370 top
[root@localhost ~]# pgrep -l -G root #列出 root 组 的进程,并显示进程名
1 systemd
2 kthreadd
3 ksoftirqd/0
5 kworker/0:0H
6 kworker/u256:0
[root@localhost ~]# pgrep -l -t pts/2 #列出 终端pts/2 的进程
5192 bash
5291 top
[root@localhost ~]# pgrep -l -a httpd #列出httpd 进程的命令
4284 /usr/sbin/httpd -DFOREGROUND
4286 /usr/sbin/httpd -DFOREGROUND
4287 /usr/sbin/httpd -DFOREGROUND
4288 /usr/sbin/httpd -DFOREGROUND
4289 /usr/sbin/httpd -DFOREGROUND
4290 /usr/sbin/httpd -DFOREGROUND
2.4 pstree 查看进程树
pstree 以树形结构列出进程信息
pstree 【选项】 【用户名】
选项
-a : 显示完整信息
-u : 列出对应用户名
-p : 列出对应的PID名
[root@caoyuzhou ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,735
│ ├─{ModemManager},757
│ └─{ModemManager},797
├─NetworkManager,841 --no-daemon
│ ├─{NetworkManager},852
│ └─{NetworkManager},857
├─VGAuthService,749 -s
├─abrt-watch-log,743 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG
├─abrt-watch-log,751 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
├─abrtd,740 -d -s
├─accounts-daemon,736
│ ├─{accounts-daemon},756
│ └─{accounts-daemon},798
├─alsactl,805 -s -n 19 -c -E ALSA_CONFIG_PATH=/etc/alsa/alsactl.conf --initfile=/lib/alsa/init/00mainrdae
├─at-spi-bus-laun,1653,gdm
│ ├─dbus-daemon,1658 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork ...
│ │ └─{dbus-daemon},1659
│ ├─{at-spi-bus-laun},1654
│ ├─{at-spi-bus-laun},1655
│ └─{at-spi-bus-laun},1657
├─at-spi2-registr,1661,gdm --use-gnome-session
│ ├─{at-spi2-registr},1663
│ └─{at-spi2-registr},1664
├─atd,1177 -f
├─auditd,710
│ ├─audispd,712
│ │ ├─sedispatch,714
│ │ └─{audispd},715
│ └─{auditd},711
├─avahi-daemon,758,avahi
│ └─avahi-daemon,775
├─bluetoothd,747
├─chronyd,785,chrony
├─colord,1763,colord
│ ├─{colord},1769
│ └─{colord},1771
├─crond,1174 -n
├─cupsd,1149 -f
├─dbus-daemon,1645,gdm --fork --print-pid 4 --print-address 6 --session
│ └─{dbus-daemon},1646
├─dbus-daemon,765,dbus --system --address=systemd: --nofork --nopidfile --systemd-activation
│ └─{dbus-daemon},793
├─dbus-launch,1644,gdm --exit-with-session /usr/libexec/gnome-session-binary --autostart...
├─dnsmasq,1506,nobody --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro...
│ └─dnsmasq,1507,root --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro...
├─firewalld,839 -Es /usr/sbin/firewalld --nofork --nopid
│ └─{firewalld},960
├─gdm,1173
│ ├─X,1618 :0 -background none -noreset -audit 4 -verbose -auth /run/gdm/auth-for-gdm-EF5JFn/database ...
│ │ ├─{X},1620
│ │ ├─{X},1621
│ │ ├─{X},1622
│ │ ├─{X},1623
│ │ └─{X},1626
│ ├─gdm-session-wor,1634
│ │ ├─gnome-session-b,1638,gdm --autostart /usr/share/gdm/greeter/autostart
│ │ │ ├─gnome-settings-,1750
│ │ │ │ ├─{gnome-settings-},1754
│ │ │ │ ├─{gnome-settings-},1756
│ │ │ │ ├─{gnome-settings-},1757
│ │ │ │ └─{gnome-settings-},1765
│ │ │ ├─gnome-shell,1673
│ │ │ │ ├─ibus-daemon,1718 --xim --panel disable
│ │ │ │ │ ├─ibus-dconf,1722
│ │ │ │ │ │ ├─{ibus-dconf},1726
│ │ │ │ │ │ ├─{ibus-dconf},1728
│ │ │ │ │ │ └─{ibus-dconf},1729
│ │ │ │ │ ├─ibus-engine-sim,1783
│ │ │ │ │ │ ├─{ibus-engine-sim},1784
│ │ │ │ │ │ └─{ibus-engine-sim},1785
│ │ │ │ │ ├─{ibus-daemon},1720
│ │ │ │ │ └─{ibus-daemon},1723
│ │ │ │ ├─{gnome-shell},1675
│ │ │ │ ├─{gnome-shell},1676
│ │ │ │ ├─{gnome-shell},1677
│ │ │ │ ├─{gnome-shell},1678
│ │ │ │ ├─{gnome-shell},1679
│ │ │ │ ├─{gnome-shell},1681
│ │ │ │ ├─{gnome-shell},1697
│ │ │ │ ├─{gnome-shell},1705
│ │ │ │ ├─{gnome-shell},1706
│ │ │ │ ├─{gnome-shell},1707
│ │ │ │ ├─{gnome-shell},1708
│ │ │ │ ├─{gnome-shell},1709
│ │ │ │ ├─{gnome-shell},1710
│ │ │ │ └─{gnome-shell},1711
│ │ │ ├─{gnome-session-b},1669
│ │ │ ├─{gnome-session-b},1670
│ │ │ └─{gnome-session-b},1672
│ │ ├─{gdm-session-wor},1635
│ │ └─{gdm-session-wor},1636
│ ├─{gdm},1200
│ ├─{gdm},1201
│ └─{gdm},1617
├─gssproxy,772 -D
│ ├─{gssproxy},778
│ ├─{gssproxy},779
│ ├─{gssproxy},780
│ ├─{gssproxy},781
│ └─{gssproxy},782
├─ibus-x11,1725,gdm --kill-daemon
│ ├─{ibus-x11},1730
│ └─{ibus-x11},1731
├─irqbalance,753 --foreground
├─ksmtuned,826 /usr/sbin/ksmtuned
│ └─sleep,1943 60
├─libvirtd,1156
│ ├─{libvirtd},1215
│ ├─{libvirtd},1216
│ ├─{libvirtd},1217
│ ├─{libvirtd},1218
│ ├─{libvirtd},1219
│ ├─{libvirtd},1220
│ ├─{libvirtd},1221
│ ├─{libvirtd},1222
│ ├─{libvirtd},1223
│ ├─{libvirtd},1224
│ ├─{libvirtd},1282
│ ├─{libvirtd},1283
│ ├─{libvirtd},1284
│ ├─{libvirtd},1285
│ └─{libvirtd},1286
├─lsmd,755,libstoragemgmt -d
├─lvmetad,526 -f
├─master,1431 -w
│ ├─pickup,1434,postfix -l -t unix -u
│ └─qmgr,1435,postfix -l -t unix -u
├─packagekitd,1738
│ ├─{packagekitd},1745
│ └─{packagekitd},1746
├─polkitd,738,polkitd --no-debug
│ ├─{polkitd},786
│ ├─{polkitd},796
│ ├─{polkitd},812
│ ├─{polkitd},814
│ └─{polkitd},824
├─pulseaudio,1701,gdm --start --log-target=syslog
│ └─{pulseaudio},1704
├─rngd,746 -f
├─rsyslogd,744 -n
│ ├─{rsyslogd},774
│ └─{rsyslogd},783
├─rtkit-daemon,804,rtkit
│ ├─{rtkit-daemon},815
│ └─{rtkit-daemon},816
├─smartd,748 -n -q never
├─sshd,1148 -D
│ ├─sshd,1210
│ │ └─bash,1438
│ │ └─pstree,1945 -aup
│ └─sshd,1437
│ └─sftp-server,1553
├─systemd-journal,504
├─systemd-logind,742
├─systemd-udevd,540
├─tuned,1151 -Es /usr/sbin/tuned -l -P
│ ├─{tuned},1256
│ ├─{tuned},1260
│ ├─{tuned},1267
│ └─{tuned},1276
├─upowerd,1682
│ ├─{upowerd},1683
│ └─{upowerd},1684
├─vmtoolsd,752
│ └─{vmtoolsd},821
├─wpa_supplicant,1743 -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -P/var/
└─xdg-permission-,1734,gdm
├─{xdg-permission-},1736
└─{xdg-permission-},1739
三: 进程的启动方式
3.1 手工启动
(1) 前台启动: 用户输入命令,直接执行程序
(2)后台启动: 在命令行尾加上“&” 符号
[root@localhost opt]# ls #前台启动ls 命令
rh
[root@localhost opt]# sleep 10 #前台启动sleep 命令
[root@localhost opt]# sleep 10 & # 后台启动sleep命令
[1] 5529 #显示的是后台命令的序号和进程号
[root@localhost opt]#
3.2 调度启动
(1) 使用at 命令 设置一次性计划任务
at 【HH:MM】 【yyyy-mm-dd】 #设置计划任务
[root@localhost opt]# date
2021年 06月 24日 星期四 11:42:29 CST
[root@localhost opt]# at 11:45 2021-06-24 #在2021-06-24 11:25 分执行计划任务,当天执行,年月日可以省略
at> pgrep -U root | wc -l > /tmp/ps.root #执行的计划 (命令)
at> <EOT> #按 ctrl + D 提交任务
job 1 at Thu Jun 24 11:45:00 2021
atq #查看未执行的任务列表
atrm 序号 #删除任务
[root@localhost opt]# atq #查看为执行的计划任务
5 Thu Jun 24 12:00:00 2021 a root #编号
[root@localhost opt]# atrm 5 #删除编号为 5 的计划任务
[root@localhost opt]# atq
(2) 使用crontab 命令设置周期性计划任务
crontab能够周期性的按照预先设置的时间周期(分 ,时 , 日, 月,周) 重复执行用户指定的命令操作
下载cronie 和 crontabs 软件包,
并启用服务,设置为开机自启
(3)编辑计划任务
crontab -e [-u 用户名] # -u 缺省,默认是当前用户
[root@localhost ~]# crontab -e
30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) #每月每天 01 点 30 分 执行 cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) 命令
crontab 主要有三个配置文件,
全局配置文件: 位于文件 /etc/crontab
系统默认的设置: 位于目录/etc/cron.*/
用户定义的设置: 位于文件 /var/spool/cron/用户名
crontab 的命令实际是在编写 /var/spool/cron/用户名 这个文件,所以我们也可以直接编写 该文件,设置计划任务
或者 编写 全局配置文件 /etc/crontab
[root@localhost ~]# echo '30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)' > /var/spool/cron/root
[root@localhost ~]# vim /var/spool/cron/root
30 1 * * * cp -a /var/log/messages /
root/log-$(date +%Y-%m-%d)
通过编写 /etc/crontab 的方式编写 ,这种方式 只有root 才可以
[root@localhost ~]# vim /etc/crontab
30 2 * * * root cp -a /var/log/messages /root/log-$(date +%Y-%m-%d) #要在时间后面加上 指定的用户
配置格式:
字段:说明
分钟:取值为0到59 之间的任意整数
小时:取值为0到23 的任意整数
日期:取值为1 到31 的任意整数
月份:取值为 1 到12 的任意整数
星期:取值为 0到 7 之间任意整数。 0 或 7 代表周日
命令:要执行的命令或者程序脚本
时间数值的特殊表示方法
“ * ” 表示该范围内任意的时间
例:0 1 * * * 每天的凌晨1点
“,” 表示 间隔的多个不连续时间点
例:30 8,10 * * * 每天的8点30 和10 点30
“-” 表示 一个连续的时间范围
例:30 8-10 * * * 每天的 8点30 分 到 10 点 30 分
“/” 表示间隔的时间频率
例30 */2 * * * 每天都每隔两小时,在30分钟时候
(4)查看计划任务
crontab -l [-u 用户名]
[root@localhost ~]# crontab -l #查看当前用户(root) 的计划任务
30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)
(5)删除
crontab -r [-u 用户名] #清空用户所有计划任务
crontab -e #进入编辑界面后,手动一条一条的精确删除
[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root
四:调度进程与结束进程
4.1 进程的前后台调度
(1)Ctrl + Z键组合
将当前进程挂起。即调入后台,并停止执行
root@localhost opt]# vim a.txt #再按下 ctrl +z 键
[1]+ 已停止 vim a.txt
(2)jobs [ -l ] 命令
查看处于后台的任务列表
[root@localhost opt]# jobs
[1]+ 已停止 vim a.txt
[root@localhost opt]# jobs -l # jobs -l 可以显示进程的pid 号
[1]+ 4666 停止 vim a.txt
(3) fg 命令
将后台进程恢复到前台运行,可以指定任务序号
root@localhost opt]# jobs -l #查看后台进程
[1] 4666 停止 vim a.txt
[2]- 4714 停止 sleep 1000
[3]+ 4715 停止 (信号) top
[root@localhost opt]# fg 3 #将编号为3的进程恢复到前台执行
[root@localhost opt]# fg #不加编号默认恢复最后一个
sleep 1000
[root@localhost opt]# jobs -l
[1]+ 4666 停止 vim a.txt
4.2 结束进程
(1) Ctrl +c键 组合
中断正在执行的命令
[root@localhost opt]# sleep 100 #按下ctrl +c 键可以结束 此次 睡眠
^C
(2) kill 和 killall 命令
kill 用于终止 指定PID 号的进程
killall 用于 终止指定名称相关的所有进程
-9 选项 用于强制终止
[root@localhost opt]# sleep 100 &
[2] 4766
[root@localhost opt]# kill 4766 #终止 pid 号为 4766 的进程
[root@localhost opt]# jobs -l
[1]+ 4666 停止 vim a.txt
[2]- 4766 已终止 sleep 100
[root@localhost opt]# killall vim #终止所有的vim 进程
[root@localhost opt]# jobs -l
[1]+ 4666 停止 vim a.txt #没有成功终止,依旧是后台停止状态
[root@localhost opt]# killall -9 vim #强制 终止 所有的 vim 进程
[1]+ 已杀死 vim a.txt
oot@localhost opt]# top &
[1] 4785
[root@localhost opt]# killall top #终止 所有的 top 进程
[1]+ 已停止 top
#注,killall 是终止所有的 同名进程 ,包括其他用户 执行的 。会造成 误终止进程
(3) pkill 命令
pkill 命令可以根据特定的条件终止相应的进程
常用命令选项
-U :根据进程所属的用户名终止相应的进程
-G : 根据进程所属组 终止相应进程
-t : 根据进程所在的终端终止相应的进程
[root@localhost opt]# pgrep -l -U test #查看test 用户的进程
4859 bash
4898 top
[root@localhost opt]# pkill -U test #终止用户 test 的进程
[root@localhost opt]# pgrep -l -U test
4859 bash
[root@localhost opt]# pgrep -l -G test #查看test 组 的进程
4859 bash
4938 sleep
[root@localhost opt]# pkill -G test #终止 test 组的进程
[root@localhost opt]# pgrep -l -G test
4859 bash
更多推荐
如何查看linux后台进程?怎么创建后台任务?看这里
发布评论