Linux 进程和计划任务管理


1. 前言

  根据维基百科的定义,进程(Process)是计算机中已运行程序的实体。用户下达运行程序的命令后,就会产生进程。进程需要一些资源才能完成工作,如 CPU 使用时间、存储器、文件以及 I/O 设备,且为依序逐一进行,也就是每个 CPU 核心任何时间内仅能运行一项进程。在 linux 中,为了更好的了解和使服务器有序运行,管理员需要对进程和计划任务做相应的操作,以便能够更好的完成维护任务。

2. 进程

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. 计划任务

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 818 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

4. 总结

  服务器上运行着大量应用,必然也伴随着大量的进程,运维管理人员经常需要对进程进行管理优化。而计划调度命令可以在一定程度上减少运维的工作量,能够熟练的使用计划调度命令是非常重要的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值