目录
一. 前言
根据维基百科的定义,进程(Process)是计算机中已运行程序的实体。用户下达运行程序的命令后,就会产生进程。进程需要一些资源才能完成工作,如 CPU 使用时间、存储器、文件以及 I/O 设备,且为依序逐一进行,也就是每个 CPU 核心任何时间内仅能运行一项进程。在 linux 中,为了更好的了解和使服务器有序运行,管理员需要对进程和计划任务做相应的操作,以便能够更好的完成维护任务。
二. 进程
2.1 什么是进程
Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位
- 进程 ID(Process ID,PID)号码被用来标记各个进程
- UID、GID、和 SELinux 语境决定对文件系统的存取和访问权限
- 通常从执行进程的用户来继承
- 存在生命周期
2.2 程序和进程的关系
- 程序是永存的,进程是暂时的。进程是程序在数据集上的一次执行,可以创建也可以撤销
- 程序是静态的观念,进程是动态的观念
- 进程具有并发性,而程序没有
- 进程是竞争计算机资源的基本单位,程序不是
- 进程和程序不是一一对应的,一个程序可对应多个进程, 一个进程也可以执行一个或几个程序
2.3 进程,线程和协程
线程(Thread):
有时被称为轻量级进程,是操作系统调度(CPU调度)执行的最小单位。一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。进程的个体间是完全独立的,而线程间是彼此依存的。多进程环境中,任何一个进程的终止,不会影响到其他进程。而多线程环境中,父线程终止,全部子线程被迫终止(没有了资源)。
#查看进程中的线程::cat /proc/PID/status |grep -i threads
协程(Coroutine):
协程是用户模式下的轻量级线程,最准确的名字应该叫用户空间线程(User Space Thread)。协程不是被操作系统内核所管理,而是完全由应用程序来控制。一个线程可以包含一个或多个协程,协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存起来,在切换回来时恢复先前保运的寄存上下文和栈。
2.4 进程常用管理命令
(1) ps
ps(process status)命令用于显示当前进程的状态
格式::ps [options] [–help]
参数 | 含义 |
---|---|
-a | 显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息 |
-u | 使用以用户为主的格式输出进程信息 |
-x | 显示当前用户在所有终端下的进程信息 |
-e | 显示所有进程 |
-f | 使用完整的格式显示进程信息 |
-l | 使用长格式显示进程信息 |
常用组合:ps [-aux] [-ef] [-elf]
示例:
[root@c7-1 ~]#ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 191004 3916 ? Ss 10:53 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 10:53 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< 10:53 0:00 [kworker/0:0H]
root 5 0.0 0.0 0 0 ? S 10:53 0:01 [kworker/u256:0]
......
#上述输出信息中,第一行为列表标题,其中各字段的含义描述如下
USER:启动该进程的用户账号的名称
PID:该进程在系统中的数字 ID 号,在当前系统中是唯一的
%CPU:CPU 占用的百分比
%MEM:内存占用的百分比
VSZ:该进程使用的虚拟内存量(KB)
RSS:该进程占用的物理内存量(KB)
TTY:表明该进程在哪个终端上运行。不是从终端启动的进程则显示为?
STAT:该进程的状态
START:启动该进程的时间
TIME:该进程占用的 CPU 时间
COMMAND:启动该进程的命令的名称
#STAT 状态类型
-D:不可被唤醒的睡眠状态,通常用于 I/O 情况
-R:该进程正在运行
-S:该进程处于睡眠状态,可被唤醒
-T:停止状态,可能是在后台暂停或进程处于除错状态
-W:内存交互状态(从 2.6 内核开始无效)
-X:死掉的进程(通常不会出现)
-Z:僵尸进程。进程已经中止,但是部分程序还在内存当中
-<:高优先级(以下状态在 BSD 格式中出现)
-N:低优先级
-L:被锁入内存
-s:包含子进程
-l:多线程
-+:位于后台
-C:进程占用 CPU 的百分比
[root@c7-1 ~]#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 - 47751 ep_pol 10:53 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
1 S root 2 0 0 80 0 - 0 kthrea 10:53 ? 00:00:00 [kthreadd]
1 S root 4 2 0 60 -20 - 0 worker 10:53 ? 00:00:00 [kworker/0:0H]
1 S root 5 2 0 80 0 - 0 worker 10:53 ? 00:00:01 [kworker/u256:0]
1 S root 6 2 0 80 0 - 0 smpboo 10:53 ? 00:00:00 [ksoftirqd/0]
......
#各列标题含义
F:内核分配给进程的系统标记
S:进程的状态
UID:启动这些进程的用户
PID:进程的进程 ID
PPID:父进程的进程号(如果该进程是由另一个进程启动的)
C:进程生命周期中的 CPU 利用率
PRI:进程的优先级(越大的数字代表越低的优先级)
NI:谦让度值用来参与决定优先级
ADDR:进程的内存地址
SZ:假如进程被换出,所需交换空间的大致大小
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
STIME:进程启动时的系统时间
TTY:进程启动时的终端设备(pts 代表虚拟终端,一般是远程连接的终端;tty 代表本地控制台终端)
TIME:运行进程需要的累计CPU时间
CMD:进程的启动命令
#指定属性排序,CentOS6 以下版本不支持
ps axo pid,cmd,%cpu,%mem k -%cpu
#按内存倒序排序
ps axo pid,cmd,%cpu,%mem --sort -%mem
#使用watch实用程序执行重复的输出以实现对就程进行实时的监视,如下面的命令显示每秒钟的监视
watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head'
#查看僵尸进程
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'
#查找僵死进程,然后将父进程杀死
ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9
(2) top
top 命令用于查看进程动态信息
格式:top [-] [选项] […]
参数 | 含义 |
---|---|
d | 改变显示的更新速度 |
c | 显示整个命令行而不只是显示命令名 |
p | 通过指定 PID 来监控某个进程的状态 |
S | 累积模式,会将己完成或消失的子行程的 CPU time 累积起来 |
s | 安全模式,将交互式指令取消, 避免潜在的危机 |
i | 不显示任何闲置或者僵死进程 |
n | 更新的次数,完成后将会退出 top |
示例:
#显示进程信息
top
#显示完整命令
top -c
#以批处理模式显示程序信息
top -b
#以累积模式显示程序信息
top -S
#设置信息更新次数,更新两次后终止更新显示
top -n 2
#设置信息更新时间,更新周期为3秒
top -d 3
#显示指定的进程信息
top -p PID
#使用者将不能利用交谈式指令来对行程下命令
top -s
(3) pgrep
通过特定条件查询进程信息
格式:pgrep [选项] [匹配条件]
参数 | 含义 |
---|---|
-l | 同时显示进程名和 PID |
-P | 指定父进程号 |
-u | 匹配有效用户 ID |
-U | 匹配实际用户 ID |
-g | 匹配列出的进程组 ID |
-G | 匹配真实组 ID |
-t | 指定开启进程的终端 |
-o | 当匹配多个进程时,显示进程号最小的那个 |
-n | 当匹配多个进程时,显示进程号最大的那个 |
示例:
[root@c7-1 ~]#pgrep -l sshd
3471 sshd
4172 sshd
[root@c7-1 ~]#ps aux|grep sshd
root 3471 0.0 0.1 112920 4320 ? Ss 8月17 0:00 /usr/sbin/sshd -D
root 4172 0.0 0.1 161532 6076 ? Ss 8月17 0:00 sshd: root@pts/1
root 4644 0.0 0.0 112728 972 pts/1 T 8月17 0:00 grep --color=auto sshd
root 4693 0.0 0.0 112728 968 pts/1 S+ 00:25 0:00 grep --color=auto sshd
(4) pstree
pstree 可以用来显示进程的父子关系,以树形结构显示
格式:pstree [OPTION] [ PID | USER ]
参数 | 选项 |
---|---|
-a | 选项可以列出完整的命令信息 |
-p | 选项使用时可以同时列出对应的 PID 号 |
-u | 选项可以列出对应的用户名 |
示例:
#系统如无 pstree 命令执行 yum -y install psmisc
[root@c6-1 ~]#pstree -aup root
init,1
├─NetworkManager,1731 --pid-file=/var/run/NetworkManager/NetworkManager.pid
├─abrtd,2078
├─acpid,1846
├─atd,2120
├─auditd,1612
......
(5) prtstat
可以显示进程信息,来自于 psmisc 包
格式:prtstat [options] PID …
选项:-r raw 格式显示
示例:
[root@c7-1 ~]#prtstat -r 1
pid: 1 comm: systemd
state: S ppid: 0
pgrp: 1 session: 1
tty_nr: 0 tpgid: -1
flags: 402100 minflt: 17726
cminflt: 1388146 majflt: 55
......
(6) uptime
系统负载查询
格式:uptime [options]
参数 | 选项 |
---|---|
-p | 显示系统运行了多长时间 |
-s | 显示系统启动的日期/时间 |
示例:
[root@c7-1 ~]#uptime
08:50:36 up 14:17, 1 user, load average: 0.00, 0.01, 0.05
#每一栏含义
系统当前时间
up表示系统正在运行
14:17是系统启动的总时间
当前上线人数
系统负载:1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报
(7) w
w 命令用于显示目前登入系统的用户信息
格式:w [-fhlsuV] [用户名称]
示例:
[root@c7-1 ~]#w
09:05:57 up 14:33, 1 user, load average: 0.02, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 20.0.0.1 08:27 5.00s 0.03s 0.00s w
(8) who
who 命令用于显示系统中有哪些使用者正在上面
格式:who - [husfV] [user]
参数 | 含义 |
---|---|
-H | 显示标题栏 |
-u | 显示闲置时间 |
-q | 只显示登入系统的帐号名称和总人数 |
示例:
[root@c7-1 ~]#who
root pts/0 2021-08-18 08:27 (20.0.0.1)
[root@c7-1 ~]#who -q
root
# 用户数=1
(9) jobs
查看当前有多少在后台运行的进程
格式:jobs [选项]
参数 | 含义 |
---|---|
-l | 列出进程的 PID 和作业号 |
-p | 只列出进程的 PID |
-s | 只列出停止的进程 |
-r | 只列出运行的进程 |
示例:
#nohup command > file 2>&1 指定日志文件目录
[root@c7-1 ~]#nohup /usr/sbin/httpd & #后台启动 httpd 并输出日志信息
[1] 5057
[root@c7-1 ~]#nohup: 忽略输入并把输出追加到"nohup.out"
[1]+ 完成 nohup /usr/sbin/httpd
[root@c7-1 ~]#tail -f nohup.out #ctrl + z 挂起进程
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 112.4.20.188. Set the 'ServerName' directive globally to suppress this message
^Z
[1]+ 已停止 tail -f nohup.out
[root@c7-1 ~]#ps aux|grep nohup.out #查找挂起的进程
root 5064 0.0 0.0 107996 616 pts/0 T 09:28 0:00 tail -f nohup.out
root 5066 0.0 0.0 112728 984 pts/0 S+ 09:28 0:00 grep --color=auto nohup.out
[root@c7-1 ~]#jobs
[1]+ 已停止 tail -f nohup.out
[root@c7-1 ~]#jobs -l
[1]+ 5064 停止 tail -f nohup.out
(10) fg & bg
- bg
将一个在后台暂停的命令变成继续执行 - fg
将后台中的命令调至前台继续运行 - jobs
查看当前有多少在后台运行的命令 - ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
(11) kill
kill 命令用于删除进程
格式:kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
参数 | 含义 |
---|---|
-l <信息编号> | 若不加信息编号选项,则会列出全部的信息编号 |
-s <信息名称或编号> | 指定要送出的信息 |
最常用的信号是:
1 (HUP):重新加载进程
9 (KILL):杀死一个进程
15 (TERM):正常停止一个进程
示例:
[root@c7-1 ~]#ps aux|grep httpd
root 5588 0.0 0.0 112728 972 pts/0 S+ 10:17 0:00 grep --color=auto httpd
[root@c7-1 ~]#service httpd start
Redirecting to /bin/systemctl start httpd.service
[root@c7-1 ~]#ps -ef|grep httpd
root 5605 1 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5606 5605 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5607 5605 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5608 5605 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5609 5605 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5610 5605 0 10:18 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 5616 4853 0 10:18 pts/0 00:00:00 grep --color=auto httpd
[root@c7-1 ~]#kill 5605
[root@c7-1 ~]#ps -ef|grep httpd
root 5624 4853 0 10:18 pts/0 00:00:00 grep --color=auto httpd
(12) pkill
根据特定条件终止相关进程
格式:pkill [选项] [条件]
参数 | 含义 |
---|---|
-t | 通过控制终端进行匹配 |
-u | 匹配有效用户 ID |
-U | 匹配实际用户 ID |
-g | 匹配列出的进程组 ID |
-G | 匹配真实组 ID |
-P | 指定父进程号发送信号 |
示例:
[root@c7-1 ~]#ps -ef|grep httpd
root 5726 4853 0 10:39 pts/0 00:00:00 grep --color=auto httpd
[root@c7-1 ~]#service httpd start
Redirecting to /bin/systemctl start httpd.service
[root@c7-1 ~]#ps -ef|grep httpd
root 5743 1 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5744 5743 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5745 5743 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5746 5743 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5747 5743 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
apache 5748 5743 0 10:39 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND
root 5750 4853 0 10:39 pts/0 00:00:00 grep --color=auto httpd
[root@c7-1 ~]#pkill httpd #根据名称杀掉 httpd 进程
[root@c7-1 ~]#ps -ef|grep httpd
root 5760 4853 0 10:39 pts/0 00:00:00 grep --color=auto httpd
(13) lsof
lsof(list open files)是一个查看进程打开的文件的工具
选项:
-a:列出打开文件存在的进程
-c<进程名>:列出指定进程所打开的文件
-u:列出UID号进程详情
-g:列出GID号进程详情
-d<文件号>:列出占用该文件号的进程
+d<目录>:列出目录下被打开的文件
+D<目录>:递归列出目录下被打开的文件
-n<目录>:列出使用NFS的文件
-i<条件>:列出符合条件的进程( IPV(4/6)协议 :端口 @ip )
-p<进程号>:列出指定进程号所打开的文件
-n: 不反向解析网络名字
示例:
#列出所有打开的文件:
lsof
#查看谁正在使用某个文件
lsof /path/file
#递归查看某个目录的文件信息,+D 对应目录下的所有子目录和文件都会被列出
lsof +D /filepath/filepath2/
#遍历查看某个目录的所有文件信息
lsof | grep '/filepath/filepath2/'
#列出某个用户打开的文件信息
lsof -u username
#列出某个程序所打开的文件信息
lsof -c mysql
#列出多个程序打开的文件信息
lsof -c mysql -c apache
#列出某个用户以及某个程序所打开的文件信息
lsof -u test -c mysql
#列出除了某个用户外的被打开的文件信息,^ 表示取反
lsof -u ^root
#通过某个进程号显示该进程打开的文件
lsof -p 1
#列出多个进程号对应的文件信息
lsof -p 123,456,789
#列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1
#列出所有的网络连接
lsof -i
#列出所有 tcp 网络连接信息
lsof -i tcp
#列出所有 udp 网络连接信息
lsof -i udp
#列出谁在使用某个端口
lsof -i:3306
#列出谁在使用某个特定的 udp 端口
lsof -i udp:55
#特定的tcp端口
lsof -i tcp:80
#列出某个用户的所有活跃的网络端口
lsof -a -u user -i
#某个用户组所打开的文件信息
lsof -g 5555
#根据文件描述列出对应的文件信息
lsof -d description(like 2)
#根据文件描述范围列出文件信息
lsof -d 2-3
三. 计划任务
3.1 一次性计划任务 – at
格式:at [HH:MM] [yyyy-mm-dd]
没有 at 命令执行 yum -y install at
示例:
[root@c7-1 ~]#yum -y install at &> /dev/null
[root@c7-1 ~]#systemctl start atd
[root@c7-1 ~]#systemctl status atd |grep active
Active: active (running) since 三 2021-08-18 12:26:07 CST; 2min 50s ago
[root@c7-1 ~]#date
2021年 08月 18日 星期三 12:32:36 CST
[root@c7-1 ~]#at 12:34 2021-08-18
at> echo "hello world" > /root/test.txt
at> <EOT>
job 4 at Wed Aug 18 12:34:00 2021
[root@c7-1 ~]#ll
总用量 4
-rw-r--r-- 1 root root 12 8月 18 12:34 test.txt
[root@c7-1 ~]#cat test.txt
hello world
3.2 周期性计划任务 – crontab
主要配置文件:
- 全局配置文件,位于文件:/etc/crontab
- 系统默认的设置,位于目录:/etc/cron.*/
- 用户定义的设置,位于文件:/var/spool/cron/用户名
常用命令格式:
- crontab -e [-u 用户名] #编辑计划任务
- crontab -l [-u 用户名] #查看计划任务
- crontab -r [-u 用户名] #删除计划任务
crontab 任务配置格式:[分钟] [小时] [日期] [月份] [星期] [命令]
字段 | 说明 |
---|---|
分钟 | 取值为从 0 到 59 之间的任意整数 |
小时 | 取值为从 0 到 23 之间的任意整数 |
日期 | 取值为从 1 到 31 之间的任意整数 |
月份 | 取值为从 1 到 12 之间的任意整数 |
星期 | 取值为从 0 到 7 之间的任意整数,0 或 7 代表星期日 |
命令 | 要执行的命令或程序脚本 |
时间数值的特殊表示方法:
- ( * )表示该范围内的任意时间
- ( ,)表示间隔的多个不连续时间点
- ( - )表示一个连续的时间范围
- ( / ) 指定间隔的时间频率
示例:
#安排一个 cron 在每天凌晨 2 点执行
0 2 * * * /scripts/script.sh
#安排一个 cron 每天上午 5 点和下午 5 点执行
0 5,17 * * * /scripts/script.sh
#安排一个 cron 每分钟执行一次
* * * * * /scripts/script.sh
#安排一个 cron 在每周日下午 5 点执行
0 17 * * sun /scripts/script.sh
#安排一个 cron 每 10 分钟执行一次
*/10 * * * * /scripts/monitor.sh
#安排一个 cron 在选定的月份执行
* * * jan,may,aug * /script/script.sh
#安排一个 cron 在选定的日期执行
0 17 * * sun,fri /script/script.sh
#安排一个 cron 在每个月的第一个星期日执行
0 2 * * sun [ $(date +%d) -le 07 ] && /script/script.sh
#安排一个 cron 每四个小时执行一次
0 */4 * * * /scripts/script.sh
#安排一个 cron 在每个星期日和星期一执行两次
0 4,17 * * sun,mon /scripts/script.sh
#安排一个 cron 每 30 秒执行一次
* * * * * /scripts/script.sh
* * * * * sleep 30; /scripts/script.sh
#在单个 cron 中安排多个任务
* * * * * /scripts/script.sh;/scripts/scrit2.sh
#安排任务每年执行,@yearly 时间戳类似于 0 0 1 1 * ,它会在每年的第一分钟执行一项任务
@yearly /scripts/script.sh
#安排任务每月执行,@monthly 时间戳类似于 0 0 1 * * ,它将在每月的第一分钟执行任务
@monthly /scripts/script.sh
#安排每周执行的任务,@weekly 时间戳类似于 0 0 * * mon ,它将在一周的第一分钟执行一项任务
@weekly /bin/script.sh
#安排每天执行的任务,@daily 时间戳类似于 0 0 * * * ,它将在每天的第一分钟执行一项任务
@daily /scripts/script.sh
#安排任务每小时执行一次,@hourly 时间戳类似于 0 * * * * ,它将在每小时的第一分钟执行一项任务
@hourly /scripts/script.sh
#安排在系统重启时执行的任务
@reboot /scripts/script.sh
#将 cron 结果重定向到指定的电子邮件帐户
https://www.jb51.cc/linux/396373.html
#将所有 cron 备份到纯文本文件
crontab -l > cron-backup.txt
四. 总结
服务器上运行着大量应用,必然也伴随着大量的进程,运维管理人员经常需要对进程进行管理优化。而计划调度命令可以在一定程度上减少运维的工作量,能够熟练的使用计划调度命令是非常重要的。