Linux—进程和计划任务管理


前言

众所周知,Windows系统是有任务管理器的,我们可以通过任务管理器来结束不需要的进程。而Linux系统中的进程就相当于Windows的任务管理器,只不过进程是需要用命令来管理的。

一、程序和进程

1.程序

  • 程序是保存在硬盘、光盘等介质中的可执行代码和数据

  • 它是静态保存的代码

2.进程

  • 进程是在CPU及内存中处于动态执行状态的计算机程序
  • 每个程序启动后可以创建一个或多个进程

3.进程和线程的区别

  • 一个程序至少有一个进程,一个进程至少有一个线程。
  • 线程的划分尺度小于进程,使得多线程程序的并发性高。
  • 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
  • 每个独立的线程有一个程序运行的入口,顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
  • 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
  • 他们的优缺点在于:
    线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移。

二、查看进程

了解系统中进程的状态是对进程进行管理的前提,使用不同的命令工具可以从不同的角度查看进程状态。

1. 查看静态的进程统计信息(ps)

ps命令是Linux系统中最为常用的进程查看工具,主要用于查看静态的进程统计信息。通过不同的命令选项,可以有选择性的查看进程信息。

  • 常用选项
选项说明
-a显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
-u使用以用户为主的格式输出进程信息
-x显示当前用户在所有终端下的进程信息
-e显示系统内的所有进程信息
-l使用长格式显示进程信息
-f使用完整的格式显示进程信息
  • 我们一般习惯将上述选项组合在一起使用,比如执行“ps aux” 或 “ps -elf”。

1.1 ps aus 命令

执行“ps aus” 命令后,将以简单列表的形式显示出进程信息,如下:

[root@localhost ~]#ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 125488  3988 ?        Ss   17:58   0:03 /usr/lib/syste
root          2  0.0  0.0      0     0 ?        S    17:58   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    17:58   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   17:58   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    17:58   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    17:58   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    17:58   0:01 [rcu_sched]
root         10  0.0  0.0      0     0 ?        S    17:58   0:00 [watchdog/0]
root         11  0.0  0.0      0     0 ?        S    17:58   0:00 [watchdog/1]
root         12  0.0  0.0      0     0 ?        S    17:58   0:00 [migration/1]
root         13  0.0  0.0      0     0 ?        S    17:58   0:00 [ksoftirqd/1]
root         14  0.0  0.0      0     0 ?        S    17:58   0:00 [kworker/1:0]
root         15  0.0  0.0      0     0 ?        S<   17:58   0:00 [kworker/1:0H]
root         16  0.0  0.0      0     0 ?        S    17:58   0:00 [watchdog/2]
root         17  0.0  0.0      0     0 ?        S    17:58   0:00 [migration/2]
root         18  0.0  0.0      0     0 ?        S    17:58   0:00 [ksoftirqd/2]
root         19  0.0  0.0      0     0 ?        S    17:58   0:00 [kworker/2:0]
root         20  0.0  0.0      0     0 ?        S<   17:58   0:00 [kworker/2:0H]

在输出结果中,第一行为列表标题,其中各字段的含义描述如下:

字段说明
USER启动该进程的用户账号的名称
PID该进程在系统中的数字ID 号,在当前系统中是唯一的(%CPU:CPU 占用的百分比)
TTY表明该进程在哪个终端上运行,“?”表示未知或不需要终端
STAT显示了进程当前的状态
START启动该进程的时间
TIME该进程占用的CPU时间
COMMAND启动该进程的命令的名称
%CPUCPU 占用的百分比
%MEM内存占用的百分比
VSZ该进程使用的虚拟内存量(swap)(KB)
RSS该进程占用的物理内存量(KB)

1.2 ps -elf 命令

  • 若执行“ps -elf”命令,则将以长格式显示系统中的进程信息,并且包含更丰富的内容。如下:
[root@localhost ~]#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 - 31372 ep_pol 817 ?       00:00:03 /usr/lib/
1 S root          2      0  0  80   0 -     0 kthrea 817 ?       00:00:00 [kthreadd
1 S root          3      2  0  80   0 -     0 smpboo 817 ?       00:00:00 [ksoftirq
1 S root          5      2  0  60 -20 -     0 worker 817 ?       00:00:00 [kworker/
1 S root          7      2  0 -40   - -     0 smpboo 817 ?       00:00:00 [migratio
1 S root          8      2  0  80   0 -     0 rcu_gp 817 ?       00:00:00 [rcu_bh]
1 S root          9      2  0  80   0 -     0 rcu_gp 817 ?       00:00:01 [rcu_sche
5 S root         10      2  0 -40   - -     0 smpboo 817 ?       00:00:00 [watchdog
5 S root         11      2  0 -40   - -     0 smpboo 817 ?       00:00:00 [watchdog
1 S root         12      2  0 -40   - -     0 smpboo 817 ?       00:00:00 [migratio
1 S root         13      2  0  80   0 -     0 smpboo 817 ?       00:00:00 [ksoftirq
#省略
.
.
.
  • 若执行不带任何选项的 ps 命令时,将只显示当前用户会话中打开的进程,如下:
[root@localhost ~]#ps
   PID TTY          TIME CMD
  1652 pts/0    00:00:00 bash
  6105 pts/0    00:00:00 ps
  • 由于系统中运行的进程数比较多,需要查询某一个进程的信息时可以结合管道符号操作和 grep 命令进行过滤。例如执行以下操作可以过滤包含“bash”的进程信息。
[root@localhost ~]#ps aux |grep bash
root        804  0.0  0.0 115256   928 ?        S    817   0:00 /bin/bash /usr/sbin/ksmtuned
root       1652  0.0  0.0 116576  3412 pts/0    Ss   817   0:00 -bash
root       6149  0.0  0.0 112680   976 pts/0    S+   00:12   0:00 grep --color=auto bash

1.3 常见的进程状态

常见的状态有以下几种:

进程说明
-D不可被唤醒的睡眠状态,通常用于 I/O 情况
-R该进程正在运行
-S该进程处于睡眠状态,可被唤醒
-T停止状态,可能是在后台暂停或进程处于除错状态
-W内存交互状态(从 2.6 内核开始无效)
-X死掉的进程(应该不会出现)
-Z僵尸进程。进程已经中止,但是部分程序还在内存当中
-<高优先级(以下状态在 BSD 格式中出现)
-N低优先级
-L被锁入内存
-s包含子进程
-l多线程(小写 L)
-+位于后台
-C进程占用CPU的百分比

其中僵尸进程大概意思可以理解为:父进程退出了而子进程没有退出。那么这些没退出去的子进程就没有父进程来管理了,所以就变成了僵尸进程。

2. 查看动态的进程统计信息(top)

2.1 top 命令输出信息详解

使用 ps 命令查看到的是一个静态的进程信息,并不能连续的反馈出当前进程的运行状态。如果希望以动态刷新的方式显示各进程的状态信息,可以使用 top 命令。

[root@localhost ~]#top
top - 00:36:46 up  6:38,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 160 total,   2 running, 158 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  3865304 total,  3136808 free,   321668 used,   406828 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  3255172 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND            
  6348 root      20   0       0      0      0 R   0.3  0.0   0:00.12 kworker/0:2        
     1 root      20   0  125488   3988   2492 S   0.0  0.1   0:03.05 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.05 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.00 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:01.11 rcu_sched        

上面输出的结果中,相关信息的表示如下:

①系统任务(Tasks)信息:

  • total:总进程数
  • running :正在运行的进程数
  • sleeping :休眠的进程数
  • stopped :终止的进程数
  • zombie :僵死无响应的进程数

②CPU占用信息:

  • us:用户占用
  • sy:内核占用
  • ni:优先级调度占用
  • id:空闲CPU
  • wa:I/O 等待占用
  • hi:硬件中断占用
  • si:软件中断占用
  • st:虚拟化占用
  • 要了解空闲的 CPU 百分比,主要看%id 部分。

③内存占用(Mem)信息:

  • total:总内存空间
  • free:空闲内存
  • used:已用内存
  • buff/cache:物理内存和交换内存的缓冲区总和。

④交换空间(Swap)占用:

  • total:总交换空间;
  • free:空闲交换空间;
  • used:已用交换空间;
  • avail Mem:可用物理空间。

2.2 常用选项

全屏操作界面快捷键如下

选项说明
s修改刷新时间按空格 ,立即刷新(top 命令默认 3s 刷新一次)
P按 CPU 排序
M按内存排序
T按时间排序
p进程 IP,查看某个进程状态
N根据启动时间进行排序
1显示每个内核的 CPU 使用率u/U:指定显示的用户
h可以获得 top 程序的在线帮助信息
q退出 top 程序

这里要注意的是如果通过 top 工具发现某个进程的CPU占用率非常高,需要终止该进程的时候,可以在top界面按 k 键,然后在列表上方将会出现“PID to signal/kill [default pid = 3180]:” 的提示信息,根据提示输入指定进程的 PID 号并按 Enter 键, 出现“Send pid 5597 signal [15/sigterm]”的二次确认的提示信息,然后按Enter 键确认即可终止对应的进程。

3.根据特定条件查询进程信息(pgrep)

  • 当使用 ps命令 查询某个进程的PID信息时,往往需要结合grep命令对输出结果进行过滤,但这样使用非常不方便,而pgrep命令则正是用来查询特点进程信息的专用工具。
  • 使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特点进程的PID号。
  • 结合“-l”选项可同时输出对应的进程名
    例如,查询进程名中包含“log”的进程及PID号
[root@localhost ~]#pgrep -l "log"
426 xfs-log/dm-0
652 xfs-log/sda1
721 systemd-logind
722 rsyslogd
746 abrt-watch-log
763 abrt-watch-log
  • 还可以结合“-U”选项查询特定用户的进程、“-t”选项查询在特点终端运行的进程。例如,查询由用户admin 在tty1终端上运行的进程及PID号:
[root@localhost ~]#pgrep -l -U root -t tty1
1444 X

4.查看进程树(pstree)

pstree 命令可以输出各种进程的树形结构,更加直观地判断出各进程之间的相互关系(父子进程)。

  • pstree命令默认只显示各进程的名称
  • 结合“-p”选项可以同时列出对应的PID号
  • 结合“-u”选项可以列出对应的用户名
  • 结合“-a”选项可以列出完整的命令信息
  • 执行“pstree -aup”命令可以查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息
[root@localhost ~]#pstree -aup
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,720
  │   ├─{ModemManager},725
  │   └─{ModemManager},738
  ├─NetworkManager,748 --no-daemon
  │   ├─dhclient,834 -d -q -sf /usr/libexec/nm-dhcp-helper -pf ...
  │   ├─{NetworkManager},775
  │   └─{NetworkManager},778
  • 也可以只查看属于指定用户的进程树结构,只要指定用户名作为参数即可。
[root@localhost ~]#pstree -ap root
systemd,1 --switched-root --system --deserialize 21
  ├─ModemManager,720
  │   ├─{ModemManager},725
  │   └─{ModemManager},738

三、控制进程

1.进程的启动方式

在Linux系统中,可以由用户手工启动或者预定计划调度启动新的进程。

1.1 手工启动进程

由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工进程又可以分为前台启动和后台启动。

  • 前台启动:用户输入命令,直接执行程序
  • 后台启动:在命令行尾加入“&”符号

例如,从光盘中制作镜像文件时,由于复制量比较多,耗时较长,可以使用“&”来将进程放入后台运行,以便可以继续执行其他操作。

[root@localhost ~]#cp /dev/cdrom mycd.iso &
[1] 5959                                            #输出结果中包括后台任务序号及PID号

1.2 调度启动进程

在服务器维护工作中,经常需要执行数据备份的任务,一般来说比较费时且占用资源,这时候我们可以计划在夜间进行。这时候就需要用户事先进行调度安排,指定任务运行的时间,当到达设定的时间会自动启动并完成指定的任务。调度启动的计划任务进程都在后台运行,不会占用用户的命令终端

  • 可以使用 at 和crontab 命令设置
  • at 命令用于设置一次性计划任务
  • crontab 命令用于设置周期性运行的计划任务

2.改变进程的运行方式

  • 挂起当前的进程
    当Linux系统的命令正在前台执行时,按 ctrl +z 组合键可以将当前的进程挂起,即调入后台并停止执行。

  • 查看后台的进程
    需要查看当前终端中在后台运行的进程任务时,可以使用 jobs 命令,结合 “-l ” 选项可以同时显示出该进程对应的PID号。

  • 将后台的进程恢复运行
    bg 命令:可以将后台中暂停执行(如按ctrl+z 组合键挂起)的任务恢复运行,继续在后台执行操作
    fg 命令:可以将后台的任务重新恢复到前台运行
    除非后台的任务只有一个,否则 bg 和 fg 都需要指定后台进程的任务编号作为参数

[root@localhost ~]#jobs -l
[1]+  5959 完成                  cp -i /dev/cdrom mycd.iso
              #[1]代表该进程在后台的任务编号

3.终止进程执行

当用户在前台执行某个进程时,可以按 ctrl +c 组合键强制执行终端(如命令长时间没有响应的情况)。如果使用ctrl+c组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具 kill 、killall、pkill 。

  • 使用 kill 命令终止进程,需要使用进程的PID号作为参数,结合“-9”选项可以强制终止进程,但是强制终止进程可能会导致部分数据丢失,所以不到不得已的情况时不要轻易使用
  • 使用 killall 命令终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令更加方便,效率更高。
  • 使用 pkill 命令终止进程,可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特点的进程,大部分选项和 pgrep 命令基本相似,如-U 指定用户、-t指定终端等。

例如,终止lisi用户启动的进程,如下:

[root@localhost ~]#pgrep -l -U "lisi"                   #确认目标进程相关信息
3045 bash
[root@localhost ~]#pkill -9 -U "lisi"                   #强制终止用户lisi的进程
[root@localhost ~]#pgrep -l -U "lisi"                   #查看是否终止

四、计划任务管理

CentOS 7系统中的计划任务是由 at 、cronie 软件包提供,通过 atd 和crond 这两个系统服务实现一次性和周期性计划任务的功能,并分别通过at 、crontab 命令进行计划任务设置。

1.一次性任务设置(at)

  • 使用at命令设置的计划任务只在指定的时间点执行一次。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后,否则将无法正确设置计划任务。
  • 设置一次性计划任务时,在 at 命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带 “at>” 提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按 Ctrl+D 组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。

案例
①设置在 2021 年8 月 19日的10:25 自动执行以下任务:统计该时间点系统中由 root 用户运行的进程的数量,并将该数值保存到/tmp/ps.root 文件中。

[root@localhost ~]#date
20210818日 星期三 16:54:42 CST
[root@localhost ~]# at 10:25 2021-08-19
at> pgrep -U root | wc -l > /tmp/ps.root       #任务设置完后按Ctrl+D 组合键提交
at> <EOT><EOT>
job 1 at 2021-08-19 1025                         

[root@localhost ~]# cat /tmp/ps.root           #过了计划时间后验证结果

②设置一条计划任务,在当天的 21:30 自动关闭当前系统。

[root@localhost ~]# at 21:30
at> shutdown -h now 
at> <EOT>

③对于已经设置但还未执行(未到时间点)的计划任务,可以通过 atq 命令进行查询。但已执行过的 at 任务将不会再出现在列表中

[root@localhost ~]# atq
2 Sun May 7 21:30:00 2021 a root

④如果想要删除指定编号的 at 任务,可以使用 atrm 命令。删除后的 at 任务将不会被执行, 并且不会显示在 atq 命令的显示结果中,但已经执行过的任务无法删除。

[root@localhost ~]# atrm 1	                 #删除第 1 条 at 计划任务
[root@localhost ~]# atq	                     #确认第 1 条任务已被删除

2.周期性任务设置(crontab)

使用 crontab 命令设置的计划任务可以按预设的周期重复执行,可以大大减轻设置重复性系统管理任务的操作。

2.1 主要设置文件

  • 全局配置文件——位于文件/etc/crontab
  • 系统默认的设置——位于/etc/cron.*/
  • 用户定义的设置——位于/var/spool/cron/

2.2 管理crontab任务计划

  • crontab -e [-u 用户名]——编辑计划任务
  • crontab -l [-u 用户名]——查看计划任务
  • crontab -r [-u 用户名]——删除计划任务
  • -u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己),一般只有 root 用户有权限使用此选项(用于编辑、删除其他用户的计划任务)。

crontab 计划任务的配置字段说明如下:

字段说明
分钟取值为从0到59之间的任意整数
小时取值为从0到23之间的任意整数
日期取值为从1到31之间的任意整数
月份取值为从1到12之间的任意整数
星期取值为从0到7之间的任意整数,0或7代表星期日
命令要执行的命令或程序脚本
  • 除了”*“之外,还可以使用减号”-“、逗号”,“、斜杠”/“与数字构成表达式来表示较复杂的时间关系。
字符说明
“*”表示该范围内的任意时间
“,”表示一个间隔内的多个不连续时间点
“-”表示一个连续的时间范围
“/”表示间隔的时间频率

案例

例如,按固定的周期重复完成一些系统管理任务,任务内容如下:

  • ①每天早上 8:55自动开启 sshd 服务,22:00 关闭 sshd 服务
  • ②每隔3天清空一次 FTP 服务器公共目录 /var/ftp/pub 中的数据
  • ③每周五的 9:00 重新启动系统中的 httpd 服务
  • ④每周一、周三、周五的下午 18:30,使用 tar 命令自动备份/etc/httpd 目录,则可由 root 用户通过 crontab 设置以下计划任务
[root@localhost ~]# crontab -e
55 8 * * * /usr/bin/systemctl start httpd.service 
00 22 * * * /usr/bin/systemctl stop httpd.service
0 0 */3 * * /usr/bin/rm -rf /var/ftp/pub/*
00 9 * * 5 /usr/bin/systemctl httpd restart
30 18 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/

删除用户的计划任务列表

  • 当只需要删除某一条计划任务时,可以通过“crontab -e”命令进行编辑。
  • 如果要清空某个用户的所有计划任务,可以执行“crontab -r”命令。
[lisi@localhost ~]$ crontab -r	                
[lisi@localhost ~]$ crontab -l
no crontab for lisi                           #用户lisi清空自己设置的计划任务

总结

Linux 系统的多任务环境决定了进程管理的重要性,及时查看并清除占用较高的进程有利于提高工作的效率。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发莫的了呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值