任务管理(job control)
执行任务管理的操作中,每个任务都是目前 bash 的子进程,即彼此之间是有相关性的。我们无法用任务管理的方式由 tty1 的环境去管理 tty2 的 bash。
要执行 bash 的任务管理需要注意:
- 这些任务所触发的进程必须来自 shell 的子进程(只管理自己的 shell)
- 前台:可以控制与执行命令的环境称为前台的任务
- 后台:可以自动执行的任务,无法使用【Ctrl+c】终止,可使用 bg、fg 调用该任务
- 后台中执行的进程不能等待 terminal 或 shel 的输入
job control 的管理
- 直接将命令丢到后台中执行
使用符号【&】可以将某些任务直接丢到后台环境中,让我们可以继续操作前台的任务。例如使用 tar 命令将 /etc
备份时放入后台,并利用数据流重定向将输出数据传送到某个文件中:
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
- 将目前任务丢到后台中暂停
使用【Ctrl+z】将目前运行的进程丢到后台中等待。例如在使用 vim 过程中按【Ctrl+z】来暂时退出到前台中。然后可以使用命令【jobs】来查看目前的后台任务状态。
jobs [-lrs]
选项与参数:
-l:除了累出 job number 与命令串,还列出 PID 号码
-r:列出正在后台 run 的任务
-s:列出正在后台 stop 的任务
- 将后台任务拿到前台处理
使用命令【fg】可以将后台任务拿到前台来处理
fg %jobnumber
选项与参数:
%jobnumber:jobnumber 为任务号码
- 让任务在后台下的状态变为运行中
【Ctrl+z】可以让目前任务丢到后台下面暂停,而命令【bg】则可以让后台暂停的任务变为运行。
bg %jobnumber
- 管理后台任务
使用命令【kill】可以删除后台的任务
kill -signal %jobnumber
kill -l
选项与参数:
-l:列出目前 kill 能使用的信号
signal:表示给予后面接的任务什么样的指示
-1:重读一次参数配置文件
-2:与 Ctrl+c 同样操作
-9:立即强制删除一个任务
-15:正常方式结束任务
脱机管理
任务管理中的【后台】是在终端模式下的情况,即 bash 的后台,而不是放在了系统的后台中,如果使用远程连接方式将任务以 & 的方式放在后台,在脱机的情况下该任务不会继续执行。
使用【nohup】命令可以再脱机或注销系统后,还能让任务继续执行。
nohup [命令与参数] # 在终端前台执行
nohup [命令与参数] & # 在终端后台执行
进程管理
Linux 系统中,触发任何一个事件时,系统都会将它定义为一个进程,并给予该进程一个 PID,同时根据触发进程的用户与相关属性关系,基于这个 PID 一组有效地权限设置。也就是说,当我们运行一个程序或命令时就可以触发一个时间而获得 PID,而不同身份的用户执行程序时,系统给予该进程的权限也不同。
- 程序(program):通常为二进制文件,放置在存储媒介中,以物理文件的形式存在。
- 进程(progress):程序被触发后,执行者的权限与属性、程序代码与所需数据等都被加载到内存中,操作系统给予给内存单元一个 PID。
一些常驻在内存中的进程称为服务(daemon),负责一些系统所提供的功能以服务用户的各项任务。
查看进程
查看进程可以利用静态的 ps 或是动态的 top 命令,还可以利用 pstree 来查看进程树之间的关系
- 显示某个时间点的进程运行情况
ps aux # 查看系统所有的进程
ps -l # 仅查看自己的 bash 相关进程
使用【ps -l】仅会列出与你的操作环境 bash 有关的进程,即最上层的父进程会是你自己的 bash。
![](https://i-blog.csdnimg.cn/blog_migrate/7ec7876154199e8139abab329e67bcda.png)
如上面的 ps 进程,其父进程 PPID 则是当前 bash 的 PID。其中 F 表示进程标识,4 表示进程权限为 root,1 表示此子进程仅执行复制而没有实际执行。S 表示进程状态,R 为运行,S 为睡眠可被唤醒,D 为不可唤醒睡眠,T 为停止,Z 为将是状态,即进程已终止但无法被删除至内存外。
僵尸进程:造成僵尸进程的原因通常是该进程以及执行完毕,或应该终止了,但该进程的父进程无法完整地将该进程结束,造成该进程一直存在内存当中。如果某进程的 CMD 后面接了 <defunct>
时,就代表该进程时僵尸进程。
- 动态查看进程的变化
【top】命令可以持续检测进程运行的状态。
top [-d 数字] | top [-bnp]
# 选项和参数
# -d:后面可以接秒数,整个进程界面更新的时间,默认 5 秒
# -b:批量方式执行 top
# -n:与 -b 搭配使用,需要执行几次 top 的输出结果
# -p:指定某些 PID 来监测
# 在 top 执行过程中可以使用的按键命令:
# ?:显示 top 中可输入的按键命令
# P:以 CPU 使用排序
# M:以内存使用排序
# q:退出 top
如果想要找进程之间的相关性,可以使用命令【pstree】。根据 pstree 的输出我们可以清楚,所有的进程都是依附在 systemd 这个进程下面的。而这个进程的 PID=1,因为它是由 Linux 内核主动调用的第一个进程。
pstree [-A|U] [-up]
# 选项与参数:
# -A:各进程树之间用 ASCII 字符连接
# -U:各进程树之间用 Unicode 字符连接
# -p:同时列出每个进程 PID
# -u:同时列出每个进程所属账号名称
管理进程
通过给予进程一个信号来管理进程,常用的信号如下:
代 号 | 名称 | 内容 |
---|---|---|
1 | SIGHUP | 启动被终止的程序,可让该PID 重新读取自己的设定档,类似重新启动 |
2 | SIGINT | 相当于用键盘输入[ctrl]-c 来中断一个程序的进行 |
9 | SIGKILL | 代表强制中断一个程序的进行,如果该程序进行到一半, 那么尚未完成的部分可能会有『半产品』产生,类似vim会有.filename.swp 保留下来。 |
15 | SIGTERM | 以正常的结束程序来终止该程序。由于是正常的终止, 所以后续的动作会将他完成。不过,如果该程序已经发生问题,就是无法使用正常的方法终止时, 输入这个signal 也是没有用的。 |
19 | SIGSTOP | 相当于用键盘输入[ctrl]-z 来暂停一个程序的进行 |
- kill -signal PID
【kill】可以将信号传送给某个任务或 PID。
- killall -signal 命令名称
kill 后面必须加上 PID,而使用 killall 命令可以利用【执行命令的名称】来给予信号。
killall [-iIe] [command name]
# 选项与参数:
# -i:若需要删除时,会出现提示字符
# -I:命令名称可忽略大小写
# -e:表示后面接的【command name】要一致
查看系统资源信息
- 查看内存使用情况
free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
# 选项与参数:
# -b:直接输入 free 时显示的单位是 KBytes,可以使用其他单位
# -t:显示物理内存与 swap 的总量
# -s:让系统不断刷新显示数据
# -c:与 -s 同时处理,列出几次的意思
- 查看系统与内核信息
uname [-asrmpi]
# 选项与参数:
# -a:所有系统相关信息
# -s:系统内核名称
# -r:系统内核版本
# -m:系统的硬件架构
# -p:CPU 的类型
# -i:硬件的平台
- 查看系统启动时间与任务负载
uptime # 显示目前系统以及运行的时间以及平均负载情况
- 追踪网络或 socket 文件
【netstat】命令常用于网络监控方面。
netstat -[atunlp]
# 选项与参数:
# -a:将目前系统所有的连接、监听、socket 信息都列出来
# -t:列出 tcp 网络封包信息
# -u:列出 udp 网络封包信息
# -n:以端口号来显示
# -l:列出目前网络监听的服务
# -p:列出网络服务的进程 PID
- 分析内核产生的信息
命令【dmesg】可以将内核产生的信息读取出来,接合【grep】命令查找需要的信息。