进程管理 和 计划任务管理

 

 

一:进程概述

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 中常见进程状态  运行 , 中断 ,不可中断 , 僵死, 停止

进程状态
含义
对应的ps命令的状态
运行
正在运行或者在运行队列中等待。
可执行状态
R 运行 runnable
中断
休眠中,受阻,在等待某个条件的形成或者接受到。
可中断的睡眠状态
S 中断 (sleeping)
不可中断
收到信号不唤醒和不可运行,进程必须等待直到有中断发生。
不可中断的睡眠状态
D 不可中断 (uninterruptible sleep)
僵死
进程已终止,但进程描述符存在,直到父进程调用wait4() 系统调用后释放。
退出,成为僵尸进程
Z 僵死 (zombie)
停止
进程收到sigstop ,sigstp,sigtin,sitout 信号后停止运行.
停止状态,或者跟踪状态
T 停止 task_stopped or task_traced

 ## 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 <pid> : 显示特定进程中的线程

 

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@localhost ~]# pstree -aup     #以树状图列出所有进程,并显示完整信息和对应用户名和PID 名
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,577
  │   ├─{ModemManager},601
  │   └─{ModemManager},625
  ├─NetworkManager,665 --no-daemon
  │   ├─{NetworkManager},674
  │   └─{NetworkManager},679
  ├─VGAuthService,576 -s
  ├─abrt-watch-log,583 -F BUG: WARNING: at WARNING: CPU:INFO: possible recursive locking d
  ├─abrt-watch-log,635 -F Backtrace /var/log/Xorg.0.log -- /usr/bin/abrt-dump-xorg -xD
  ├─abrtd,582 -d -s
  ├─accounts-daemon,637
  │   ├─{accounts-daemon},641
  │   └─{accounts-daemon},648

[root@localhost ~]# pstree -aup test     # 以树状图查看 用户 test 的进程
bash,4331
  └─top,4370

 

三: 进程的启动方式

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 命令 设置一次性计划任务

(2) 使用crontab 命令设置周期性计划任务

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

 

3.2.2 crontab  设置周期性计划任务

能够周期性的按照预先设置的时间周期(分 ,时 , 日, 月,周) 重复执行用户指定的命令操作

(1) 下载cronie 和 crontabs  软件包,并启用服务,设置为开机自启

[root@localhost ~]# yum -y install  cronie crontables                      #下载软件包
[root@localhost ~]# systemctl start crond                                  #启动crond 
[root@localhost ~]# systemctl enable crond #将crond 服务设置为开机自启

 

 

(2) 编辑计划任务

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 

通过编写 /var/spool/cron/root文件的方式
[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分钟时候

 

 

 

 

 

 

 

 

(3) 查看计划任务

crontab -l [-u 用户名] 

[root@localhost ~]# crontab -l                                     #查看当前用户(root) 的计划任务
30 1 * * * cp -a /var/log/messages /root/log-$(date +%Y-%m-%d)

 

 

(4) 删除

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

 

posted @ 2021-06-24 20:06  知己一语  阅读(225)  评论(0编辑  收藏  举报