程序与进程管理

ppgo8 于 2022-12-04 发布

程序与进程管理

任务管理

​ Linux操作系统是多任务操作系统,可以同时执行多个程序。但是通常每个用户登录服务器后只有一个终端环境,要在一个终端执行多个任务,就需要进行任务管理。

任务管理的意义

​ 有些命令输入之后回车就可以返回结果,之后可以继续输入其他命令。也有些命令,如nano文本编辑器,执行该命令后会进步编译器环形,再执行其他命令就需要先退出nano编辑器,返回到终端环境中才可以。

​ 在图形界面中,如果需要同时执行多个命令,可以采用开启多个终端的做法来实现,每个终端执行一个命令即可,例如同时执行两个nano程序,打开两个文件同时践行编辑。

​ 在字符界面环境中只有一个终端,此时如果需要执行两个nano编辑器是无法再打开一个终端的。Linux操作系统提供了很多实用的命令来实现任务管理,也可以将运行的程序在前台和后台之间切换,已达到多任务同时运行的目的。

后台执行程序

​ 当执行一个耗时比较长的程序时,如果还希望做一些其他工作,可以直接让该程序在后台运行,bash环境中可以使用&符号实现这一点。

后台暂停程序

​ 实现两个nano编辑器同时运行的问题,可以使用Ctrl+T、Ctrl+Z组合键将正在执行的程序切换到后台,之后再使用jobs、fg等命令对后台程序进行管理。

启动后台暂停程序

​ 使用Ctrl+Z的组合键切换到后台的程序都会暂停运行,对于一些程序,比如nano编辑器来说,这是没问题的。但是对于其他一些任务,如下载任务,及时切换到后台,依然希望能够继续运行、继续下载,此时可以使用bg命令启动在后台已经暂停的程序。

删除后台程序

​ 当后台程序执行错误或者其他原因不希望其继续执行时,可以将程序切换到前台,再正常关闭该程序或者按Ctrl+C组合键,强制将程序进行关闭。但是这些方法都是必须切换到前台才可以进行,很多时候可能想直接结束掉一个程序,此时可以使用kill命令来讲后台程序删除(杀死)。

kill,常用选项:
-l: 英文字符,列出目前kill命令可用的信号
-1: 数字1,对应SIGHUP信号,重新读取一次参数配置
-2: 数字2,对应SIGINT信号,执行和Ctrl+C组合键相同的操作
-9: 数字9,对应sigkill信号,强制杀死一个程序
-15: 数字15,对应SIGTERM信号,以正常方式终止一个任务,也是kill命令的默认值

image-20221203220803899

程序后台脱机运行

​ 上述所有的示例中,即使一些程序已经切换到了后台运行,实际也只是在终端环境下的后台一旦关闭功终端,无论是前台还是后台的程序都会被结束掉。如果是远程连接的方式连接到远程主机进行工作,一旦网络环境不稳定造成一次脱机,那么所有的工作都将被强制结束,下次登录时需要重新开始,很显然这是无法接受的。所以对于一些需要长时间运行的任务,可以切换到系统后台中执行,终端关闭后,依然可以执行,该操作使用screen命令来实现。

​ screen是一款由GUN计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令会话行,并在期间自由切换。只要screen本身没有被终止掉,其中运行的所有任务都可以被恢复,即使网络终端,只要再次登录,使用screen命令就可以找回上次正在运行的程序。

screen命令,常用选项
-A:将所有的视窗都调整为目前终端机的大小
-d:将指定的screen作业离线
-r:恢复离线的screen作业
-R:先试图恢复
-S:指定screen环境的名称
-x:恢复之前离线的screen环境
-ls或--list:

​ screen命令可以创建多个环境,从一个screen环境中退出,通常使用Crtl+A+Z组合键。接下来依然以下载QQ镜像为例,演示如何使用Ubuntu命令实现任务的后台运行且不会因终端关闭而结束进程。

-A: 将所有的视窗都调整为目前终端机的大小
-d: 将指定的screen作业离线
-r: 恢复李晓妮的screen作业
-R: 先试图恢复离线的作业,若找不到离线的作业,即建立新的screen环境
-S: 指定screen环境名称
-x: 恢复之前离线的screen环境
-ls: 显示目前所有的screen环境

image-20221204002045447

进程管理

​ 每一个程序在执行时,都需要占用一定的系统资源,如CPU时间、内存空间等,所有的系统资源成为进程,进程是系统进行资源分配的基本单位

查看进程

​ Linux操作系统提供了许多命令来进行进程的查看及管理,常用的有ps、pstree、top命令。

关闭进程

​ 之前提到的kill程序删除后台程序,实际上是关闭了该后台程序的进程,达到了删除目的

image-20221203183113200

​ 在上述示例中,首先创建一个后台任务,之后使用ps和grep命令查找nano命令查看nano的进程PID。之后使用kill杀死进程。

进程优先级

​ Linux操作系统会根据进程优先级进行排序,之后再分配CPU,内存等资源。Linux进程的优先级由两部分构成,即内核优先级NI值,最终的优先级PRI值使内核优先级的值与NI值的和,优先级值越低,则该进程的优先级越高。其中,内核优先级是内核动态调整的,用户无法调整。用户可以调整的是进程的NI值,同时为了防止用户随意更改进程优先级,抢占系统资源或恶意降低他人优先级,一般用户只能调整自己进程的NI值,且只能加不能减。但root用户可以调整任意用户的进程,且可以加也可以加也可以减。新执行的命令可以使用nice命令更改NI值,已经运行的程序可以使用renice命令来进行NI值额度更改。

系统资源查看

​ 之前讲到可以使用top命令查看系统资源的占有率的情况,同时也显示了总体额度一些信息。除此之外,Linux还提供了其他专门用来查看系统资源的命令

计划任务管理

​ Windows操作系统的计划任务或开机启动项就是计划任务,这些计划任务在满足预定的触发条件(时间、时间等)时就会执行相应的任务。在Linux操作系统中,也可以实现类似的计划任务。

单次计划管理

​ 单次计划只会执行一次,执行完毕后,该计划会自动删除,是比较常用的一种方式。在Linux系统中,可以使用at命令来创建单次计划。

at 选项 时间参数 ,常用选项如下:
-m : 当at命令指定的任务完成后,以Email的方式通知用户任务完成
-l : 列出目前系统中当前用户的at调度中的任务
-d : 取消at调度中的任务
-c : 显示某项任务的实际命令内容

​ 另外,at命令的时间参数设置很灵活,有多种方式可以选择,常用的时间参数如下

HH:MM   时间格式,如13:00,在该时间点执行任务,如果设置任务时已超过13:00,则明天执行
HH:MM YYYY-mm-dd   日期+时间格式,在指定日期指定时间执行任务
HH:MM[am|pm] + 数字[minutes|hours|days|weeks]  在某个时间点加上时间段才开始,比如:04pm+3days表示三天后的下午四点执行

image-20221203201433882

​ 由于at命令的执行并不是在特定的某个用户Shell环境中,且at环境的任务在用户离线时仍能执行,很容易对系统安全产生威胁,所以Linux操作系统并不是所有用户都可以运行at命令来创建计划任务的。

​ 通常会采用/etc/at.allow和/etc/at.deny两个文件来控制哪些用户可以使用at命令,在不同的法相版本中,并不一定是两个文件都存在的。

循环任务管理(未完成)

​ 在工作过程中,经常会遇到任务需要循环执行的情况,比如工作日定时打卡上班、定时发送工作日报等。

​ 循环任务可以使用crontab命令,和at命令使用不太相同,crontab命令主要作用是修改/var/spool/cron/crontabs目录中的任务列表文件,该任务列表文件名称与当前用户名同名。任务列表文件中记录了任务执行时间、命令内容等信息。

关机期间的计划管理

​ 无论at还是crontab任务管理,都是在开始的情况下才有效的,如果出发任务的时间恰好在关机期间,那么开机后因为时间已经过去,任务便不再执行。对于7*24小时午休的服务器来说,影响不大,但是对于个人计算机,由于关机时间不固定的问题,将会总成任务执行失败的问题。

​ 为了解决这个问题,Linux操作系统系统了anarcon命令来对任务进行监测,一旦检测到有任务在关机期间应该执行而没有执行,便会重新执行该任务。anacron会以一天、一周、一个月为单位去检测系统中为践行的crontab任务,所以anacron本身并不具有管理任务计划的能力,只是能够检测crontab的任务计划而已。实际上,anacron命令的执行,也已经被安排到了crontab任务计划中。

系统服务管理

​ Windows操作系统下的服务包括各种驱动程序、输入法、管家程序都会在开机后依次启动,并以系统服务的形式进行。在Linux操作系统中,也存在大量的服务,本节就简单介绍Linux操作系统中服务的管理。

systemd简介

​ 服务是常驻在系统中提供特定功能的应用程序(daemon),例如,循环计划任务管理服务由程序crond(daemon)提供。一般任务服务和daemon是相同的。

​ init是UNIX和类UNIX系统中用来产生其他所有进程的应用程序。init进程的进程号是1,是Linux内核启动后第一个运行的程序,之后再由init进行加载服务、启动shell、启动图形化界面工作等。在关机时,init又负责关闭服务等操作。

​ systemd是Ubuntu操作系统中负责init工作的这样一套程序。目前绝大多数Linux发行版都已经采用了systemd代替了init程序。systemd将daemon统称为服务单元(unit),不同的unit按功能区分为不同的类型(type)。常见的基本类型包括系统服务、数据监听和socket、储存系统等类型

systemctl简介

​ 作为systemd主命令,systemd服务的绝大多数管理命令都是有systemctl实现。systemctl主要作用是获取systemd服务返回信息或发送控制命令到systemd服务

​ systemtcl的众多功能大多依靠辅助指令来实现。辅助命令根据不同主要分为7大类:服务单元管理指令、服务单元文件管理指令、设备管理制定、工作计划管理制定、环境管理制定、daemon生命周期管理指令、系统管理指令。

systemctl常用辅助指令
status : 查看系统服务状态
list-units : 列出所有运行的服务
list-unit-files : 列出所有可用服务
start : 启动服务
stop : 关闭服务
restart : 重启服务 
enable : 启用服务,被启用的服务会在系统启动时自动启动
disable : 禁用服务,被禁用的服务在系统启动时不会自动启动
kill : 杀死某个服务

查看服务信息

​ Windows操作系统中提供了‘任务管理器’来查看服务的各项信息,即服务名称、描述、状态、所属组、PID等。在Linux操作系统中,可以使用systemctl命令的辅助命令status来查看服务的信息。下面以cron任务计划服务来演示服务信息的查看。

image-20221203210740916

服务的启动与关闭

​ 服务作为一种应用程序,一般在系统启动时启动,同时也可以被手动关闭或重启。服务的启动、关闭使用systemctl中的start、stop、和restrat是三个辅助指令实现。下面以cron计划服务演示服务的启动和关闭。

服务配置文件说明

​ 由上述示例可知,每个服务都有对应的配置文件信息,该文件保存在/lib/systemd/system目录下,以service为拓展名。除了service外,/lib/systemd/system/下还保存了其他一些拓展名文件。

socket : socket通信使用的服务
target : 执行环境类型,多个服务单元的集合,可以同时拥有多个服务
mount/automount : 文件挂在相关的服务
path : 检测待定的文件或目录类型
timer : 功能类似anacrontab,但是由systemd提供并控制

systemctl设置开机启动任务(未完成)

​ 开机自启动是一项很方便的功能,Windows操作系统中大部分软件都可以在安装时选择是否开机自动启动,而Linux操作系统中大部分在非必要的情况下都不会自动启动,可以使用创建服务的方式间接实现程序的开机启动。

​ 设置开机启动需要以下几个步骤。