理论:linux进程和计划任务管理
前言
查看进程:分为动态查看和动态查看
成都创新互联公司服务项目包括吴兴网站建设、吴兴网站制作、吴兴网页制作以及吴兴网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,吴兴网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到吴兴省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
控制进程:以关掉进程为主,可以按条件关闭指定进程,全部关闭所有进程
at 一次性任务设置
crontab 周期性任务设置
一: 程序和进程的关系
1、 程序
保存在硬盘、光盘等介质中的可执行代码和数据
- 静态保存的代码
2、 进程
在CPU及内存中运行的程序代码
动态执行的代码
- 父、子进程
- 每个进程可以创建一个或多个进程
3、程序、进程、线程之间的三者关系
一个应用程序可以包含一个或多个应用进程
一个进程包含一个或多个线程
线程是执行操作的最小单元
例子:
应用程序=工厂
进程=车间
线程=工人
高并发处理依赖于多线程操作
二 :查看静态进程信息 ps
2.1 ps 命令
直接执行不带任何子选项的命令时,将只显示当前用户会话中打开的进程
[root@localhost ~]# ps
PID TTY TIME CMD
4898 pts/1 00:00:00 bash
5249 pts/1 00:00:00 ps
2.2 ps aux 命令
查看静态的进程统计信息
[root@localhost ~]# ps aux
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128212 6836 ? Ss 10:43 0:01 /usr/lib/systemd/s
root 2 0.0 0.0 0 0 ? S 10:43 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 10:43 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 10:43 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S 10:43 0:00 [kworker/u256:0]
root 7 0.0 0.0 0 0 ? S 10:43 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 10:43 0:00 [rcu_bh]
root 9 0.0 0.0 0 0 ? R 10:43 0:00 [rcu_sched]
root 10 0.0 0.0 0 0 ? S 10:43 0:00 [watchdog/0]
root 12 0.0 0.0 0 0 ? S 10:43 0:00 [kdevtmpfs]
root 13 0.0 0.0 0 0 ? S< 10:43 0:00 [netns]
root 14 0.0 0.0 0 0 ? S 10:43 0:00 [khungtaskd]
a 显示当前终端下的所有进程信息,包括其他用户的进程。与x结合时将显示系统中所有的进程信息 不带-
u 使用已用户为主的格式输出进程信息,不带-
x 显示当前用户在所有中终端下的进程信息,不带-
-e 显示系统中的所有进程信息
-l 使用长格式(long)显示进程信息
-f 使用完整的(full/)格式显示进程信息
竖着读的一列叫做字段,也叫做属性
字段 | 解释 |
---|---|
USER | 启动该进程的用户账号的名称 |
PID | 该进程在系统中的数字ID进程号,在当前系统中是唯一的 |
%CPU | CPU的资源渣用率 |
%MEM | 内存的占用率 |
VSZ | 虚拟内存,在进程启用完毕后会释放归0 |
RSS | 占用物理内存的大小(常驻内存) |
TTY | 显示了该进程在哪个终端上运行,是在本地终端还是在远程终端。“?”表示未知或者不需要终端 |
STAT | 进程状态,S代表休眠,R代表运行,Z代表僵死,s代表父进程,<代表高优先级,N代表低优先级,+代表前台进程,l代表多线程;对于僵死进程需要及时手动关闭终止 |
TIME | 表示启动该进程的已运行时间 |
COMMAND | 表示启动该进程的命令的所处位置 |
2.3 ps elf命令
- 查看静态的进程统计信息
[root@localhost ~]# ps -fle
[root@localhost ~]# ps -fle
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 32053 ep_pol 10:43 ? 00:00:01 /usr/lib/systemd/sy
1 S root 2 0 0 80 0 - 0 kthrea 10:43 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo 10:43 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker 10:43 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker 10:43 ? 00:00:00 [kworker/u256:0]
1 S root 7 2 0 -40 - - 0 smpboo 10:43 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp 10:43 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - 10:43 ? 00:00:00 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo 10:43 ? 00:00:00 [watchdog/0]
5 S root 12 2 0 80 0 - 0 devtmp 10:43 ? 00:00:00 [kdevtmpfs]
1 S root 13 2 0 60 -20 - 0 rescue 10:43 ? 00:00:00 [netns]
1 S root 14 2 0 80 0 - 0 watchd 10:43 ? 00:00:00 [khungtaskd]
1 S root 15 2 0 60 -20 - 0 rescue 10:43 ? 00:00:00 [writeback]
1 S root 16 2 0 60 -20 - 0 rescue 10:43 ? 00:00:00 [kintegrityd]
1 S root 17 2 0 60 -20 - 0 rescue 10:43 ? 00:00:00 [bioset]
额外看到PPID,可以详细了解到该子进程的父进程是谁
PRI 用户态的优先级,可以进行人为控制的优先级
NI 是nice值(-20~19,值越小优先级越大)
不输入-,只输入ps lef得到一下结果
[root@localhost ~]# ps lef
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 4898 4894 20 0 116100 2808 do_wai Ss pts/1 0:00 -bash USER=root LOGNAME=r
4 0 5436 4898 20 0 148984 1468 - R+ pts/1 0:00 \_ ps lef XDG_SESSION_ID
4 0 2386 2379 20 0 116348 2868 n_tty_ Ss+ pts/0 0:00 bash USER=root LANG=zh_CN
4 0 1371 1150 20 0 281984 26360 ep_pol Ssl+ tty1 0:01 /usr/bin/X :0 -background
2.4 结合管道操作
由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤
举例:
[root@localhost ~]# ps aux | grep bash
root 781 0.0 0.0 115308 948 ? S 10:43 0:00 /bin/bash /usr/sbin/ksmtuned
root 1748 0.0 0.0 51376 584 ? Ss 10:43 0:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "env GNOME_SHELL_SESSION_MODE=classic gnome-session --session gnome-classic"
root 2386 0.0 0.1 116348 2868 pts/0 Ss+ 10:43 0:00 bash
root 4898 0.0 0.1 116100 2808 pts/1 Ss 13:45 0:00 -bash
root 5360 0.0 0.0 112728 968 pts/1 R+ 14:18 0:00 grep --color=auto bash
[root@localhost ~]# ps aux | grep "bash$"
root 2386 0.0 0.1 116348 2868 pts/0 Ss+ 10:43 0:00 bash
root 4898 0.0 0.1 116100 2808 pts/1 Ss 13:45 0:00 -bash
三 :查看动态进程信息 top
top命令
- 查看动态的进程排名信息
[root@localhost ~]# top
表格是动态的
- tasks 系统任务信息; total 总进程数; running 正在运行的进程数; sleeping 休眠的进程数; stopped 中止的进程数; zombie 僵死无响应的进程数
- cpu占用信息(%Cpu(s));us 用户占用; sy 内核占用; ni 优先级调度占用; id 空闲cpu; wa I/O等待占用; hi 硬件中断占用; si 软件中断占用; st 虚拟化占用;
- Kib MEN 内存占用信息; total 总内存空间; used 已用内存; free 空闲内存;buff/cache 缓冲区域
- KiB Swap 交换空间占用; total 总交换空间; used 已用交换空间; free 空闲交换空间; avail Mem 缓存空间
在top查看过程中,可以按c键根据cpu占用情况对进程列表进行排序,按M可以根据MEM内存占用情况进行排序,按h获得帮助信息,按q退出top程序,按k就是关闭进程(kill),通常情况下k中会有当前占用内存最高的pid在其中,默认直接关闭,也可以输入对应的pid去回车终止对应的进程
动态top查看主要看cpu占用
四 :查看进程信息 pgrep
pgrep命令
根据特定条件查询进程PID信息
[root@localhost ~]# pgrep -l "log"
400 xfs-log/dm-0
594 xfs-log/sda1
624 xfs-log/dm-2
688 systemd-logind
707 rsyslogd
715 abrt-watch-log
727 abrt-watch-log
[root@localhost ~]# pgrep "log"
400
594
624
688
707
715
727
[root@localhost ~]# pgrep -l -U root -t tty1
1371 X
pgrep pid进程的过滤
-l 长格式显示,即显示进程名
-U 指定特定用户,检索查询该用户的进程
-t 指终端(telent ) tty1 代表远程终端
本地终端登录时会反馈为1
五: 查看进程信息 pstree
- 以树形结构列出进程信息
-a 显示完整信息
-u 列出对应用户名
-p 列出对应PID号
[root@localhost ~]# pstree -aup '查看所有完整信息和所有用户以及列出与所有对应PID的进程树'
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,689
│ ├─{ModemManager},708
│ └─{ModemManager},756
├─NetworkManager,788 --no-daemon
│ ├─dhclient,911 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
│ ├─dhclient,913 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens36.pid -lf...
│ ├─{NetworkManager},792
│ └─{NetworkManager},795
├─VGAuthService,700 -s
├─abrt-watch-log,715 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG
├─abrt-watch-log,727 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
├─abrtd,710 -d -s
├─accounts-daemon,694
│ ├─{accounts-daemon},706
│ └─{accounts-daemon},757
......//省略部分信息
[root@localhost ~]# pstree -ap root '只查看root用户的所有完整命令信息和对应的PID的进程数'
systemd,1 --switched-root --system --deserialize 21
├─ModemManager,689
│ ├─{ModemManager},708
│ └─{ModemManager},756
├─NetworkManager,788 --no-daemon
│ ├─dhclient,911 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens33.pid -lf...
│ ├─dhclient,913 -d -q -sf /usr/libexec/nm-dhcp-helper -pf /var/run/dhclient-ens36.pid -lf...
│ ├─{NetworkManager},792
│ └─{NetworkManager},795
├─VGAuthService,700 -s
├─abrt-watch-log,715 -F BUG: WARNING: at WARNING: CPU: INFO: possible recursive locking detectedernel BUG
├─abrt-watch-log,727 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
├─abrtd,710 -d -s
├─accounts-daemon,694
│ ├─{accounts-daemon},706
│ └─{accounts-daemon},757
六 : 进程的启动方式
6.1 手工启动
- 前台启动:用户输入命令,直接执行程序
- 后台启动;在命令行尾加入“&(读end)”符号,后台启用是为了防止文件过大会影响正常使用系统,这时就要去后台启用
[root@localhost dev]# cp /dev/cdrom mycd.iso&
[1] 6721 '输出信息中包括后台任务序号、产生对应的PID号'
6.2 调度启动(at、crontab)
- 使用at命令,设置一次性计划任务
- 使用crontab命令,设置周期性计划任务
6.3 进程的前后台调度
- Ctrl+Z 组合键
- 将当前进程挂起,即调入后台并停止执行
- jobs 命令
- 查看处于后台的进程列表
- fg命令
- 将后台进程恢复到前台运行,可通过指定任务序号去选中
- bg命令
- 将后台中的暂停执行的程序恢复运行,在后台进行接下来的操作
因为要复制的内容容量过大,所以会卡一下
命令执行完毕就会弹出命令行
为了解决这个问题,便出现了&
[root@localhost mnt]# cp -r Packages/ /opt/pas '要执行的操作命令'
^C 'ctrl+c中止命令'
[root@localhost mnt]# cp -r Packages/ /opt/pas & '后台运行'
[2] 6970 '显示序号和进程PID号'
[root@localhost mnt]# jobs '查看后台的进程'
[1]+ 已停止 cp -i /dev/cdrom mycd.iso(工作目录:/dev)
[2]- 运行中 cp -i -r Packages/ /opt/pas &
[root@localhost mnt]# jobs -l '-l可以详细列出pid号,以此进行管理'
[1]+ 6730 停止 (tty 输入) cp -i /dev/cdrom mycd.iso(工作目录:/dev)
[2]- 6970 运行中 cp -i -r Packages/ /opt/pas &
[root@localhost mnt]# cp -rf Packages/ /opt/pa
^Z 'ctrl+z把前台运行的命令切换到后台,被切换到后台的命令会被停止,如果需要再次让其运行,需要fg'
[2]+ 已停止 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# fg 2 'fg 序号'
cp -i -rf Packages/ /opt/pa '被切换到前台继续运行'
^Z '再次切换到后台'
[2]+ 已停止 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# jobs '再次查看后台程序'
[1]- 已停止 cp -i /dev/cdrom mycd.iso(工作目录:/dev)
[2]+ 已停止 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# jobs -l
[1]- 6730 停止 (tty 输入) cp -i /dev/cdrom mycd.iso(工作目录:/dev)
[2]+ 7114 停止 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# kill -9 6730 '强制杀掉pid为6730的进程'
[root@localhost mnt]# jobs -l '查看'
[1]- 6730 已杀死 '被杀死' cp -i /dev/cdrom mycd.iso(工作目录:/dev)
[2]+ 7114 停止 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# kill -9 7114 '依法炮制7114'
[root@localhost mnt]# jobs -l
[2]+ 7114 已杀死 cp -i -rf Packages/ /opt/pa
[root@localhost mnt]# fg -2 '再次把后台序号为2的进程切换到前台'
-bash: fg: -2: 无效选项 '反馈无效选项'
fg: 用法:fg [任务声明]
[root@localhost mnt]# jobs -l '再次查看'
[root@localhost mnt]# '都没了'
七: 终止进程的运行
7.1 Ctrl+c 组合键
- 终端正在执行的命令
7.2 kill、killall 命令
- kill用于终止指定PID号的进程 kill pid
- killall用于终止指定名称的所有进程 killall 进程
- -9 选项用于强制终止
[root@localhost mnt]# systemctl start httpd '开启httpd'
[root@localhost mnt]# netstat -ntap | grep 80 '查看80端口'
tcp6 0 0 :::80 :::* LISTEN 7466/httpd
[root@localhost mnt]# killall -9 httpd '终止httpd的所有进程'
[root@localhost mnt]# netstat -ntap | grep 80
[root@localhost mnt]#
7.3 pkill命令
- 根据特定条件终止相应的进程
- 常用命令选项
- -U:根据进程所属的用户名终止相应进程
- -t :根据进程所在的终端终止相应进程
[root@localhost mnt]# pgrep -l -U "lisi" '检索用户-u lisi的进程,并显示-l pid对应的进程'
7954 gnome-keyring-d
7972 gnome-session-b
7979 dbus-launch
7980 dbus-daemon
8038 gvfsd
8043 gvfsd-fuse
8129 ssh-agent
8148 at-spi-bus-laun
8153 dbus-daemon
8158 at-spi2-registr
8175 gnome-shell
8183 pulseaudio
8190 ibus-daemon
[root@localhost mnt]# pkill -9 -U "lisi" '强制终止-9 用户-U lisi的所有进程'
[root@localhost mnt]#
[root@localhost mnt]# pgrep -l -U "lisi" '再次检索lisi,发现什么都没有'
[root@localhost mnt]#
[root@localhost mnt]# which pkill '查看pkill的命令位置在哪'
/usr/bin/pkill '在usr下面的bin中,即所有用户都可以使用'
pkill -9 -U 代表强行注销用户
普通用户不可以踢掉pkill root
八、 计划任务管理 at、crond
8.1 at命令
- 一次性计划任务
[root@localhost mnt]# at [HH:MM] [yyyy-mm-dd] 'at 小时:分钟 年-月-日'
[root@localhost mnt]# date '查看当前时间'
2019年 11月 12日 星期二 17:30:57 CST
[root@localhost mnt]# at 17:33 2019-11-12
at> pgrep -U root | wc -l > /opt/test.txt
at> 'ctrl+d,提交任务'
job 1 at Tue Nov 12 17:33:00 2019
[root@localhost mnt]# atq '查看配置的任务,结果没有'
[root@localhost mnt]# date '看眼日期'
2019年 11月 12日 星期二 17:33:59 CST '过时间了'
[root@localhost mnt]# cat /opt/test.txt
180 '出现结果'
这个命令的时间必须是当前时间之后
date 获取当前系统时间
at>后面跟在未来的这个时间要执行的命令
eot 就是按ctrl +D键提交任务
也可以atq查看 ,查看将要指定的执行任务的列表
案例:在当天的21:30时自动关闭当前系统
[root@localhost mnt]# at 21:30 2019-11-12
at> shutdown -h now '关闭当前系统'
at>
job 2 at Tue Nov 12 21:30:00 2019
[root@localhost mnt]# atq
2 Tue Nov 12 21:30:00 2019 a root
[root@localhost mnt]# atrm 2 '删除计划任务2'
[root@localhost mnt]# atq
atrm 删除 计划任务
8.2 crontab命令
- 按照预先设置的时间周期(分时日月周)重复执行用户指定的命令操作
- 属于周期性计划任务
- 主要设置文件
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:/etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
8.3 管理cron计划任务
- 编辑cron计划任务
[root@localhost mnt]# crontab -e [-u 用户名]
- 查看计划任务
[root@localhost mnt]# crontab -l [-u 用户名]
- 删除计划任务
[root@localhost mnt]# crontab -r [-u 用户名]
e edit,创建计划任务
-l list 列表
-r 删除
8.4 时间数值的特殊表示方法
符号 | 解释 |
---|---|
* | 表示该位置的范围内所有时间 |
, | 表示间隔的多个不连续时间点 |
- | 表示一个连续的时间范围 |
/n | 指定间隔的时间频率为n |
8.5 应用实例
示例 | 解释 |
---|---|
0 17 1-5 | 周一到周五每天17点 |
30 8 1,3,5 | 每周一周三周五的8点30分 |
0 8-18/2 * | 每天8点到18点之间每隔两小时 |
0 /3 | 每三天 |
[root@localhost mnt]# crontab -e
"/tmp/crontab.16EW6c" 1L, 37C '自动进入这个文件内配置'
'*/2 * * * * ps aux | wc -l > /ps.txt' '输入单引号内的配置'
:wq '保存退出'
no crontab for root - using an empty one
crontab: installing new crontab
[root@localhost mnt]# crontab -l '查看计划任务'
*/2 * * * * ps aux | wc -l > /ps.txt
九、 总结
- 查看进程的命令(ps、top、pgrep、pstree)
- 进程控制
- 启动进程
- 调度进程(Ctrl+z组合键、jobs、bg、fg)
- 终止进程(kill、killall、pkill)
- at命令设置计划任务
- crontab计划任务的配置字段
分享文章:理论:linux进程和计划任务管理
转载源于:http://scjbc.cn/article/pgjcsg.html