查看和控制进程
程序与进程的关系
-
程序
- 保存在硬盘、光盘等介质中的可执行代码和数据
- 静态保存的代码
- 进程
- 在
CPU
及内存中运行的程序代码 - 动态执行的代码
- 父、子进程
- 每个进程可以创建一个或多个进程
- 在
简单的说,程序是指电脑可以识别运行的指令集合。进程是一个正在执行的程序。进程是程序的一部分,程序运行的时候会产生进程。
查看进程
了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的 角度查看进程状态。
ps
命令——查看静态的进程统计信息- 命令格式
ps [选项]
- 常用选项
a
:显示当前终端下的所有进程信息,包括其他用户的进程。u
:使用以用户为主的格式输出进程信息。x
:显示当前用户在所有终端下的进程信息。-e
:显示系统内的所有进程信息。-l
:使用长格式显示进程信息。-f
:使用完整的格式显示进程信息。
[[email protected] ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193700 6500 ? Ss 14:05 0:06 /usr/lib/systemd/system
root 2 0.0 0.0 0 0 ? S 14:05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 14:05 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 14:05 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 14:05 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 14:05 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? S 14:05 0:02 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 14:05 0:00 [watchdog/0]
...//省略部分内容...
在上面的输出信息中,第一行为列表标题,其各字段含义如下:
USER
:启动该进程的用户账号的名称。
PID
:该进程在系统中的数字 ID 号,在当前系统中是唯一的。
%CPU
:CPU 占用的百分比。
%MEM
:内存占用的百分比。
VSZ
:占用虚拟内存(swap 空间)的大小。
RSS
:占用常驻内存(物理内存)的大小。
TTY
:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。
STAT
:显示进程当前的状态,如 S(休眠)、R(运行)、Z(僵死)、<(高优先级)、 N(低优先级)、s(父进程)、+(前台进程)。
START
:启动该进程的时间。
TIME
:该进程占用的 CPU 时间。
COMMAND
:启动该进程的命令的名称。
[[email protected] ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 48425 ep_pol 14:05 ? 00:00:06 /usr/lib/systemd/systemd --switche
1 S root 2 0 0 80 0 - 0 kthrea 14:05 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 14:05 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 14:05 ? 00:00:00 [kworker/0:0H]
1 S root 7 2 0 -40 - - 0 smpboo 14:05 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 14:05 ? 00:00:00 [rcu_bh]
1 S root 9 2 0 80 0 - 0 rcu_gp 14:05 ? 00:00:02 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 14:05 ? 00:00:00 [watchdog/0]
5 S root 11 2 0 -40 - - 0 smpboo 14:05 ? 00:00:01 [watchdog/1]
...//省略部分内容...
在上面的输出信息中,我们可以看出两个输出结果相比较来说ps -elf输出的内容更为全面,其列表字段也有些不同,含义如下:
UID
:与上面的USER含义相同。
PPID
:当前进程的父进程。
C
:cpu的占用 。
PRI
:优先级(用户态的优先级)。
NI
:内核优先级(-20~19) 数值越低优先级越高。
ADDR
:运行状态 (-表示正在运行)。
SZ
: 表示占用swap交换分区容量。
WCHAN
:当前进程内核态的名称
直接执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程:
[[email protected] ~]# ps
PID TTY TIME CMD
1624 pts/0 00:00:00 bash
12076 pts/0 00:00:00 ps
top
命令——查看进程动态信息使用
ps
命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。若希望以动态刷新的方式显示各进程的状态信息,可以使用top
命令。top
命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU
、内存等系统资源占用情况,默认情况下每三秒钟刷新一次,其作用基本类似于Windows
操作系统中的任务管理器。
Tasks: 145 total, 1 running, 144 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.2 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1867048 total, 478488 free, 339336 used, 1049224 buff/cache
KiB Swap: 4194300 total, 4193864 free, 436 used. 1294208 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
615 root 20 0 305296 6204 4820 S 0.3 0.3 0:13.89 vmtoolsd
1 root 20 0 193700 6500 3688 S 0.0 0.3 0:07.02 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.31 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.11 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:02.43 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.12 watchdog/0
上述输出信息中,开头的部分显示了系统任务(Tasks)
、CPU
占用、内存占用(Mem)
、交换空间(Swap)
等汇总信息,相关信息的含义表述如下:
Tasks
系统任务信息:total
:总进程数;running
:正在运行的进程数;sleeping
:休眠的进程数;stopped
:中止的进程数;zombie
:僵死无响应的进程数
CPU
占用信息:us
:用户占用;sy
:内核占用;ni
:优先级调度占用;id
:空闲 CPU
,wa
:I/O
等待占用;hi
:硬件中断占用;si
:软件中断占用;st
:虚拟化占用
Mem
内存占用信息:total
:总内存空间;free
:空闲内存;used
:已用内存;buff/cache
:物理内存和交换内存的缓冲区总和
Swap
交换空间占用:total
:总交换空间;free
:空闲交换空间;used
:已用交换空间;avail Mem
:可用物理空间。
在top命令模式下还可以通过"c键"
会根据CPU
占用情况来排序列表;"m键"
会根据内存占用情况来排序;“q键“
退出模式
pgrep
命令——查询进程信息通过
pgrep
命令,可以只指定进程的一部分名称进行查询- 常用格式
-l: [进程名称]
-U [用户名称]
-t [终端]
[[email protected] ~]# pgrep -l "log"
291 xfs-log/sda2
[[email protected] ~]# pgrep -l -U root -t tty1
10050 X
pstree
命令——查看进程树pstree
命令可以输出Linux
操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父进程、子进程)。- 常用格式
-a:显示完整信息
-u:列处对应用户名
-p:列出对应PID号
[[email protected] ~]# pstree -aup
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,575
│ ├─{ModemManager},591
│ └─{ModemManager},601
├─NetworkManager,669 --no-daemon
│ ├─dhclient,793 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
│ ├─{NetworkManager},681
│ └─{NetworkManager},685
├─VGAuthService,567 -s
├─abrt-watch-log,577 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
├─abrt-watch-log,618 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BU
├─abrtd,569 -d -s
...//省略部分内容...
也可以只查看属于指定用户的进程树结构,只要指定用户名作为参数即可。
[[email protected] ~]# pstree -ap sun
at-spi-bus-laun,12820
├─dbus-daemon,12825 --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork ...
│ └─{dbus-daemon},12826
├─{at-spi-bus-laun},12821
├─{at-spi-bus-laun},12822
└─{at-spi-bus-laun},12824
at-spi2-registr,12828 --use-gnome-session
├─{at-spi2-registr},12831
└─{at-spi2-registr},12832
...//省略部分内容...
控制进程
1、启动进程
在 Linux
操作系统中,可以由用户手工启动或者按预订计划调度启动新的进程
- 手工启动进程
- 前台启动:用户输入命令,直接执行程序
- 后台启动:在命令行尾加入“&”符号
[[email protected] ~]# cp /opt/data/Packages/ /mnt/ & //将Packages目录复制到mnt目录,并在后台运行
[1] 15054 //显示后台运行文件任务序号、PID号
- 调度启动
使用
at
命令,设置一次性计划任务使用
crontab
命令,设置周期性计划任务
2、改变进程的运行方式
Ctrl+Z
组合键挂起当前的进程当 Linux 操作系统中的命令正在前台执行时,按
Ctrl+Z
组合键可以将当前命令调入后台并停止执行。
[[email protected] ~]# cp -r /opt/data/Packages/ /mnt //执行命令将Packages文件复制到mnt目录
^Z //按Ctrl+Z 组合键将任务调到后台运行,并停止任务
[1]+ 已停止 cp -i -r /opt/data/Packages/ /mnt //任务调到后台并停止
[[email protected] ~]#
jobs
命令——查看后台的进程需要查看当前终端中在后台运行的进程任务时,可以使用
jobs
命令,结合“-l”
选项可以同时显示该进程对应的PID
号。
[[email protected] ~]# jobs -l //查看后台运行的进程
[1]+ 15254 停止 cp -i -r /opt/data/Packages/ /mnt //显示后台信息
fg
命令——将后台的进程恢复运行使用
fg
命令可以将后台任务重新恢复到前台运行。除非后台中的任务只有一个,fg
命令需要指定后台进程的任务编号作为参数。
[[email protected] ~]# fg 1 //将后台任务调制前台运行
cp -i -r /opt/data/Packages/ /mnt //任务返回前台继续运行
bg
命令——将后台中暂停执行任务在后台恢复执行使用
bg
命令,可以将后台中暂停执行(如按Ctrl+Z
组合键挂起)的任务恢复运行,继续在后台执行操作,除非后台中的任务只有一个,否则bg
命令需要指定后台进程的任务编号作为参数。
[[email protected] ~]# jobs -l //查看后台运行进程
[1]+ 15254 停止 cp -i -r /opt/data/Packages/ /mnt
[[email protected] ~]# bg 1 //启动在后台暂停的程序,并在后台执行
[1]+ cp -i -r /opt/data/Packages/ /mnt & //开始执行任务
[[email protected] ~]# jobs -l //查看后台运行进程
[1]+ 15254 运行中 cp -i -r /opt/data/Packages/ /mnt & //任务继续在后台运行
3、终止进程执行
kill
命令——用于终止指定PID
号的进程通过 kill 命令终止进程时,需要使用进程的
PID
号作为参数。无特定选项时,kill
命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9”
选项强行终止进程。
[[email protected] ~]# rm -rf /mnt/Packages/ //删除mnt目录下Packages目录为文件
[[email protected] ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15602
[[email protected] ~]# jobs -l //查看后台运行任务,并显示PID号
[1]+ 15602 运行中 cp -i -r /opt/data/Packages/ /mnt &
[[email protected] ~]# kill 15602 //终止后台运行的PID号为15602的任务
[[email protected]lhost ~]# jobs //查看后台任务
[1]+ 已终止 cp -i -r /opt/data/Packages/ /mnt //任务已终止
[[email protected] ~]# rm -rf /mnt/Packages/ //删除mnt目录下Packages目录为文件
[[email protected] ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15754
[[email protected] ~]# kill -9 15754 //强制停止PID号为15754的任务
[[email protected] ~]# jobs -l //查看后台任务信息
[1]+ 15754 已杀死 cp -i -r /opt/data/Packages/ /mnt //任务强制停止
killall
命令——用于终止指定名称的所有进程使用
killall
命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用killall
命令将更加方便,效率更高。killall
命令同样也有“-9”
选项。
[[email protected] ~]# rm -rf /mnt/Packages/ //删除mnt目录中刚复制的Packages
[[email protected] ~]# cp -r /opt/data/Packages/ /mnt & //复制文件Packages到mnt目录,并在后台运行
[1] 15825
[[email protected] ~]# cp -r /opt/data/Packages/ /boot &
[2] 15827 //复制文件Packages到目录boot,并在后台运行
[[email protected] ~]# killall cp //停止全部cp任务
[1]- 已终止 cp -i -r /opt/data/Packages/ /mnt
[2]+ 已终止 cp -i -r /opt/data/Packages/ /boot //已全部停止
[[email protected] ~]# vim /mnt/data1 & //编辑文件data1,并在后台运行
[1] 16007
[[email protected] ~]# vim /mnt/data2 & //编辑文件data2,并在后台运行
[2] 16009
[1]+ 已停止 vim /mnt/data1
[[email protected] ~]# jobs -l //查看后台运任务
[1]- 16007 停止 (tty 输出) vim /mnt/data1
[2]+ 16009 停止 (tty 输出) vim /mnt/data2
[[email protected] ~]# killall -9 vim //强制结束后台vim程序
[1]- 已杀死 vim /mnt/data1
[2]+ 已杀死 vim /mnt/data2 //已强制停止
pkill
命令——根据特定条件终止相应的进程使用
pkill
命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep
命令基本类似。- 常用选项
-U
:根据进程所属的用户名终止相应进程-t
:根据进程所在的终端终止相应进程-9
:强制结束进程(结合-U命令可以强制指定用户下线)
[[email protected] ~]# who //查看登录用户
root pts/0 2019-08-27 22:02 (192.168.144.1)
sun :0 2019-08-27 20:04 (:0)
[[email protected] ~]# pkill -9 -U sun //强制sun客户下线
[[email protected] ~]# who //查看登录用户
root pts/0 2019-08-27 22:02 (192.168.144.1) //sun用户被踢出
计划任务管理
在Linux
操作系统中,除了用户即时执行的命令操作以外,还可以配置在指定的时间、指定的日期执行预先计划的系统管理任务(如定期备份、定期采集监测数据)。CentOS
系统中默认已安装了at
、cronie
软件包,通过 atd
和 crond
这两个系统服务实现一次性、周期性计划任务的功能,并分别通过 at
、crontab
命令进行计划任务设置。
at 一次性任务设置
设置一次性计划任务时,在at
命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at>”
提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D
组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。
- 命令格式
at [HH:MM] [YYYY-MM-DD]
atq
命令:查看计划性任务atrm [序列号]
:删除任务
[[email protected] ~]# date //获取当前时间
2019年 08月 27日 星期二 23:40:32 CST
[[email protected] ~]# at 23:45 2019-08-27 //设置一次性计划任务,在23:45分执行
at> ps aux | wc -l > /opt/ps.txt //输入指令查看进程,并统计信息,生成文件ps.txt
at> <EOT> //输入结束后按Ctrl+D组合键提交任务
job 1 at Tue Aug 27 23:45:00 2019
[[email protected] ~]# atq //查看计划性任务
1 Tue Aug 27 23:45:00 2019 a root
[[email protected] ~]# date //获取当前时间
2019年 08月 27日 星期二 23:46:51 CST
[[email protected] ~]# ls /opt //查看计划性任务是否执行,看文件是否生成文件
data ps.txt rh //成功生成文件ps.txt
[[email protected] ~]# date
2019年 08月 27日 星期二 23:49:42 CST
[[email protected] ~]# at 23:53 2019-08-27 //设置一次性计划任务,在23:53分执行
at> ps aux | wc -l > /opt/ps1.txt //输入指令查看进程,并统计信息,生成文件ps1.txt
at> <EOT> //输入结束后按Ctrl+D组合键提交任务
job 2 at Tue Aug 27 23:53:00 2019
[[email protected] ~]# atq //查看计划性任务
2 Tue Aug 27 23:53:00 2019 a root
[[email protected] ~]# atrm 2 //删除计划性任务2
[[email protected] ~]# atq //查看计划性任务
[[email protected] ~]# //成功删除
crontab 周期性任务设置
使用crontab
命令设置的计划任务可以按预设的周期重复执行,从而大大减轻设置重复性系统管理任务的操作。启用周期性任务也有一个前提条件,即对应的系统服务crond
必须已经运行。
1、crontab
的配置文件和目录
/etc/crontab
——系统任务配置文件
[[email protected] ~]# cat /etc/crontab
SHELL=/bin/bash //设置执行计划任务的 Shell 环境
PATH=/sbin:/bin:/usr/sbin:/usr/bin //定义可执行命令及程序的路径
MAILTO=root //将任务输出信息发送到指定用户的邮箱
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
- )
/var/spool/cron/
——用户cron
任务的配置文件存放目录由用户自行设置的
cron
计划任务将被保存到目录/var/spool/cron/
中,文件名与用户名相同。
2、使用 crontab
命令管理用户的计划任务
- 命令格式
crontab [选项] [-u 用户名]
- 常用选项
-e :编辑计划任务
-l:查看计划任务
-r:删除计划任务
- 周期性计划任务书写格式
* * * * * run_command
字段 含义 说明 * 分钟 取值为0~59之间的任意整数 * 小时 取值为0~23之间的任意整数 * 日期 取值为1~31之间的任意整数 * 月份 取值为1~12之间的任意整数 * 星期 取值为0~7之间的任意整数,0或7代表星期日 run_command 命令 要执行的命令或程序脚本 - 时间数值的特殊表示方法
“*”
:表示该范围内的任意时间“,”
:表示间隔的多个不连续的时间点“-”
:表示一个连续的时间范围“/”
:指定间隔的时间频率[[email protected] ~]# crontab -e //编辑周期性计划任务
33 00 /usr/bin/cp -r /home/sun /opt/ //每天00:33分执行复制命令
~
~
:wq //保存退出
[[email protected] ~]# crontab -l //查看周期性计划任务
33 00 /usr/bin/cp -r /home/sun /opt/ //设置的周期性计划任务
[[email protected] ~]# crontab -r //删除周期性计划任务
[[email protected] ~]# crontab -l //查看周期性计划任务
no crontab for root //没有设置的周期性计划任务
谢谢观看,希望能够帮助到大家!!!
原文地址:https://blog.51cto.com/14473285/2433132