第十一章 管理Linux软件包和进程
11.1 RPM 管理工具
( 1 ) RPM 是红帽包管理 (Redhat Package Manager) 的缩写。
由Red Hat 公司提出的一种软件包管理标准。
是Linux 各发行版中应用最广泛的软件包格式之一(还有 debian 的发行版 deb 安装包)。
RPM功能通过 rpm 命令使用不同参数来实现。
( 2 ) rpm 软件包中包含有关于本软件包的相关信息, 便于对软件包信息进行查询。 RPM 软件包的典型命名格式:
软件名-版本号-发行号.操作系统版本.硬件平台的类型.rpm ,比如 zsh-5.0.2-14.el7.x86_64.rpm
( 3 ) rpm 包相关网站 http://rpmfind.net/ http://rpm.pbone.net/
( 4 ) rpm 安装

通过本地光盘镜像文件安装 rpm 包
#安装tree包
[root@master Packages]# rpm -ivh tree-1.7.0-15.el8.x86_64.rpm
#卸载tree包
[root@master Packages]# rpm -evh tree
从网上下载rpm包并安装,http://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/s/sl-5.02-1.el8.x86 _64.rpm
[root@kongd ~]# wget http://rpmfind.net/linux/epel/8/Everything/x86_64/Packages/s/sl-5.02-1.el8.x86_64.rpm
[root@kongd ~]# rpm -ivh sl-5.02-1.el8.x86_64.rpm
( 5 ) rpm 查询功能( rpm –q 常与下面参数组合使用)

#查询某个包有没有安装(包名不能写错)
[root@master Packages]# rpm -q httpd
httpd-2.4.37-43.module+el8.5.0+747+83fae388.3.x86_64#查询所有已经安装的包
[root@master Packages]# rpm -qa#查询安装该包后会产生哪些文件
[root@master Packages]# rpm -ql tree
/usr/bin/tree
/usr/lib/.build-id
/usr/lib/.build-id/47
/usr/lib/.build-id/47/6e749c56abc75d25e3bc5c29e83507a605fd53
/usr/share/doc/tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz#查询该文件由哪个软件包产生
[root@master Packages]# rpm -qf /usr/bin/ls
coreutils-8.30-12.el8.x86_64
( 6 ) rpm 包签名验证
#系统中数字证书的位置
[root@master Packages]# ll /etc/pki/rpm-gpg/
total 12
-rw-r--r-- 1 root root 1073 Apr 1 2020 RPM-GPG-KEY-CentOS-SIG-ConfigManagement
-rw-r--r--. 1 root root 1672 Oct 9 2021 RPM-GPG-KEY-rockyofficial
-rw-r--r--. 1 root root 1672 Oct 9 2021 RPM-GPG-KEY-rockytesting
#导入密钥
[root@master Packages]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[root@master Packages]# rpm -qa | grep gpg-pubke
gpg-pubkey-6d745a60-60287f36
注:如果在系统上安装 RPM 包时指定要校验,系统会自动验证包的数字证书,验证通过则可以安装,反之将无法安装
#卸载密钥(不推荐)
[root@master Packages]# rpm -e gpg-pubkey-6d745a60-60287f36
11.2 YUM/DNF 管理工具
YUM (Yellow dog Updater , Modified) , RHEL8 中默认使用的软件批量管理工具由原版本的 yum 换成了速度更快的dnf( DNF = Dandified YUM ),原有的 yum 命令仅为 dnf 的软链接,当然依旧可以使用。
[root@kongd ~]# ll `which yum`
lrwxrwxrwx. 1 root root 5 2月 14 2019 /usr/bin/yum -> dnf-3
( 1 ) YUM/DNF 功能
在线下载、 安装、 卸载、 升级rpm 软件包
自动查找并解决rpm 包之间的依赖关系,一次性安装所有具有依赖关系的 rpm 包,而无需管理员逐个、 手工地去安装每一个rpm 包
( 2 )如何实现 yum/DNF 安装
系统会去读取 /etc/yum.repos.d/ 目录下的 .repo 结尾的文件,从该文件中读取以下内容实现装包:
包含各种rpm 安装文件的软件仓库( rhel8 有两个仓库, rhel7 只有一个仓库)
BaseOS存储库:提供一套核心的底层操作系统功能,为基础软件安装库
AppStream存储库:包括额外的用户空间应用程序、运行时语言和数据库
软件仓库的地址信息
( 3 )配置 .repo 文件,即 yum 源
建立本地源
[root@kongd ~]# mkdir /media/cdrom
#将本地光盘挂载至本地目录/media/cdrom下
[root@kongd ~]# mount /dev/cdrom /media/cdrom
[root@kongd ~]# cat /etc/yum.repos.d/rhel8.repo
[RHEL8-BaseOS]
name=RHEL8-BaseOS
baseurl=file:///media/cdrom/BaseOS
gpgcheck=0
#gpgcheck=1 #如果gpgcheck为1,需要写秘钥文件路径
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[RHEL8-Appstream]
name=RHEL8-Appstream
baseurl=file:///media/cdrom/AppStream
gpgcheck=0
#gpgcheck=1
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
[root@kongd ~]# yum repolist
#验证能否装包成功
[root@master ~]# yum install bind-utils -y
建立网络源(Redhat9暂时无公开的网络源,暂不可配置,其他发行版本可自行选择对应网源仓库)
阿里云网络源,aliyun的镜像站点为https://mirrors.aliyun.com/
#此处以redhat8.5为例
[root@master ~]# cat /etc/redhat-release
Rocky Linux release 8.5 (Green Obsidian)
注:此处先查看自己的发行版本信息,选择相应的仓库。
#仓库文件可以自己写也可以从aliyun网站下载
[root@master ~]# cat /etc/yum.repos.d/aliyun.repo
[appstream]
name=appstream
baseurl=https://mirrors.aliyun.com/rockylinux/8.5/AppStream/x86_64/os/gpgcheck=0
#gpgcheck=1 #如果gpgcheck为1,需要写秘钥文件路径
#gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
[baseos]
name=baseos
baseurl=https://mirrors.aliyun.com/rockylinux/8.5/BaseOS/x86_64/os/gpgcheck=0
#gpgcheck=1
#gpgkey=https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-rockyofficial
( 4 ) yum/dnf 工具管理软件包
```bash
#查看包、包组相关信息
yum repolist [all] #查看系统中yum资源库配置信息
yum list all #列出仓库里所有可安装的软件包
yum list installed [包名] #列出己经安装的所有的或指定的rpm包(包名中可使用匹配符)
yum info 包名 #查看指定软件包的详细信息
yum grouplist #查看仓库里而所有包组
yum groupinfo 包组名 #查看指定包组里而的详细信息
#安装、更新包和包组
yum install [-y] 包名 #安装指定的软件包,-y则在工作过程中需要使用者响应, 这个选个参数可以直接回答yes
yum update [-y] 包名 #升级指定的软件包或主机中所有已安装的软件包
yum groupinstall 包组名 #安装指定包组里面的所有包
#卸载软件包
yum remove [-y] 包名 #卸载已经安装在系统中的指定的软件包
#搜索文件由哪个包产生
yum provides 文件名 #查找指定的文件属于哪个包
yum whatprovides /etc/fstab #查看这个文件是由那个包提供的#模糊搜索包名
yum search 模糊包名 #查看模糊包名的软件包
#清空缓存
yum clean packages all #清除下载到本机的指定的软件包或所有软件包的yum源缓存
11.3 源代码编译
( 1 )使用源代码安装软件的优点
由于自由软件的最新版本大都以源码的形式最先发布,编译安装可以获得软件的最新版本,及时修复bug
如果当前安装的程序无法满足需求,用户可以根据需要重新配置、自由修改源代码,加入新的功能
( 2 )编译需求
确认源代码编译环境:需安装支持 C/C++ 程序语言的编译器 yum install gcc
下载相应的源码软件包
( 3 )安装
[root@localhost ~]# cd /opt/
[root@localhost opt]# curl https://mirrors.tuna.tsinghua.edu.cn/gnu/wget/wgetlatest.tar.gz -o wget-latest.tar.gz
[root@localhost opt]# tar xf wget-latest.tar.gz
[root@localhost opt]# ll
total 4968
drwxr-xr-x. 14 root root 4096 Feb 27 00:27 wget-1.21.3
-rw-r--r--. 1 root root 5079864 Jun 1 09:36 wget-latest.tar.gz
[root@localhost opt]# cd wget-1.21.3/
[root@localhost wget-1.21.3]# yum install openssl openssl-devel make -y
[root@localhost wget-1.21.3]# ./configure --with-ssl=openssl #针对当前系统、软件环境,配置好安装参数
[root@localhost wget-1.21.3]# make # 将源代码文件编译为二进制的可执行程序
[root@localhost wget-1.21.3]# make install #将编译好的程序文件复制到系统中
( 4 )测试是否安装成功
[root@localhost ~]# wget www.baidu.com
11.4 进程简介
( 1 )程序、进程、线程
程序 : 二进制文件,文件存储在磁盘中,例如 /usr/bin/ 目录下 进程 :进程是已启动的可执行程序的运行实例。
进程和程序并不是一一对应的关系,相同的程序运行在不同的数据集上就是不同的进程
进程还具有并发性和交往性,而程序却是封闭的
线程: 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是 进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有
线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行。
( 2 )进程分类

11.5 查看进程
11.5.1 ps 命令查看进程
ps显示某个时间点的程序运行情况
-a :显示所有用户的进程 -u :显示用户名和启动时间 -x :显示 没有控制终端的进程 -e :显示所有进程,包括没有控制终端的进程 -l :长格式显示 -w:宽行显示,可以使用多个 w 进行加宽显示 -f:做一个更完整的输出
#查看当前用户的进程
[root@localhost ~]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 42097 42091 0 80 0 - 29040 wait pts/0 00:00:00 bash
0 R 0 43256 42097 0 80 0 - 34857 - pts/0 00:00:00 ps
说明:
F:代表这个程序标志(process flags),说明这个程序的权限。常见号码有:4表示此程序的权限为root;1表示此子程序仅进行复制(fork)而没有实际执行(exec)
S:代表这个程序的状态(STAT),主要的状态有:R(Running):该程序正在运作中;S(Sleep):该程序目前正在睡眠状态(idle),但可以被唤醒;D:不可被唤醒的睡眠状态,通常可能是在等待I/O的情况;T:停止状态(stop),可能是在工作控制(后台暂停)或traced状态;Z(Zombie):僵尸状态,程序已经终止但却无法被移除至记忆体外。+:位于后台的进程组
UID/PID/PPID:代表此程序被该UID所拥有/程序的PID号码/此程序的父进程PID号码。
C:代表CPU使用率,单位为百分比;
PRI/NI:Priority/Nice的缩写,代表此程序被CPU所执行的优先顺序,数值越小代表该程序越快被CPU执行。
ADDR/SZ/WCHAN:都与内存有关,ADDR是kernel funcition,指出该程序在内存的哪个部分,如果是running的程序,一般会显示-。SZ代表此程序用掉多少内存,WCHAN表示目前程序是否运作中,若为-表示正在运行。
TTY:登入者的终端机位置,若为远程终端登入则使用动态终端界面(pts/n)。
TIME:使用掉的CPU时间,即此程序实际花费CPU运作的时间。
CMD:触发此进程的指令是什么。
#查看所有用户执行的进程的详细信息
[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 44776 do_epo ? 00:00:01 systemd
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
1 I 0 3 2 0 60 -20 - 0 - ? 00:00:00 rcu_gp
#查看当前用户的进程
[root@localhost ~]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1280 2.2 0.2 237304 5408 tty1 Ss+ 15:54 0:00 -bash
root 1415 0.1 0.2 237172 5092 pts/0 Ss 15:55 0:00 -bash
root 1452 0.0 0.2 268484 4008 pts/0 R+ 15:55 0:00 ps -u
[root@localhost ~]# ps aux |less
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 2164 648 ? Ss 08:47 0:00 init [5]
说明:
USER: 运行进程的用户
PID: 进程ID
%CPU: CPU占用率
%MEM: 内存占用率
VSZ: 占用虚拟内存
RSS: 占用实际内存 驻留内存
TTY: 进程运行的终端
STAT: 进程状态 man ps (/STATE)R 运行S 可中断睡眠 SleepD 不可中断睡眠T 停止的进程Z 僵尸进程X 死掉的进程s 进程的领导者,父进程< <优先级较高的进程N N优先级的进程+ +表示是前台的进程组l 以线程的方式运行
START: 进程的启动时间
TIME: 进程占用CPU的总时间
COMMAND: 进程文件,进程名[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 44776 do_epo ? 00:00:01 systemd
#自定义显示字段
[root@localhost ~]# ps axo user,pid,ppid,%mem,command
USER PID PPID %MEM COMMAND
root 1 0 0.7 /usr/lib/systemd/systemd --switched-root --system
root 2 0 0.0 [kthreadd]
root 3 2 0.0 [rcu_gp]
#查看进程树
[root@localhost ~]# pstree
查看指定进程信息
#查看指定进程的PID
[root@localhost ~]# ps aux | grep sshd
root 752 0.0 0.3 92288 6976 ? Ss 15:46 0:00 /usr/sbin/sshd -D -
oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-
cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512 -
oGSSAPIKexAlgorithms=gss-curve25519-sha256-,gss-nistp256-sha256-,gss-group14-sha256-,gssgroup16-sha512-,gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffiehellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchangesha1,diffie-hellman-group14-sha1 -oHostKeyAlgorithms=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-certv01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,sshed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-256-certv01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-certv01@openssh.com -oPubkeyAcceptedKeyTypes=ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-certv01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-certv01@openssh.com,rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=ecdsasha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-ed25519,rsa-sha2-256,rsa-sha2-512,ssh-rsa
root 1408 0.0 0.5 153360 10204 ? Ss 15:55 0:00 sshd: root [priv]
root 1412 0.0 0.5 153356 10936 ? Ss 15:55 0:00 sshd: root [priv]
root 1413 0.0 0.3 153700 6212 ? S 15:55 0:00 sshd: root@pts/0
root 1438 0.0 0.2 153356 5412 ? S 15:55 0:00 sshd: root@notty
[root@localhost ~]# cat /run/sshd.pid
752
#查看指定进程的PID
[root@localhost ~]# pgrep -l sshd
752 sshd
1408 sshd
1412 sshd
1413 sshd
1438 sshd
[root@localhost ~]# pidof sshd
752
1408
1412
1413
1438
#查看指定进程的PID
[root@localhost ~]# pidof sshd
1438 1413 1412 1408 752
11.5.2 top 命令查看进程
语法: top [ - d 数字 ] | [ - bnp]
-d:后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒
-b:以批次的方式执行top,还有更多的参数可用。通常会搭配数据流重定向来将批处理的结果输出为文件。
-n:与-b搭配,进行几次top的输出结果
-i:不显示闲置或者僵死的进程信息
-c:显示进程的整个命令路径,而不是只显示命令名称
-s:使top命令在安全模式下运行,此时top的交互式指令被取消,避免潜在危险
-p:指定某些个PID来进行查看检测
[root@localhost ~]# top -d 1
[root@localhost ~]# top -d 1 -p 10126 查看指定进程的动态信息
[root@localhost ~]# top -d 1 -p 10126,1
[root@localhost ~]# top -d 1 -u apache 查看指定用户的进程
[root@localhost ~]# top -d 1 -b -n 2 > top.txt 将2次top信息写入到文件
[root@localhost ~]# top
top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 1790.0 total, 1278.5 free, 240.5 used, 271.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1393.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 179104 13540 8728 S 0.0 0.7 0:01.22 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par+
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker+
9 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_perc+
10 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftir+
11 root 20 0 0 0 0 I 0.0 0.0 0:00.13 rcu_sch+
top 的输出可以分为 统计信息区 和 进程信息区 两个部分,即前 5 行为统计信息区,后面为进程信息区。
统计信息区
第一行为任务队列信息:top - 17:21:03 up 4:32, 5 users, load average: 0.19, 0.08, 0.06
17:21:03表示当前系统时间; up 4:32 表示系统已经启动 4 小时 32 分钟了;
5 users表示当前登录系统的用户数;
load average: 0.19, 0.08, 0.06表示系统 1 分钟、 5 分钟、 15 分钟前到现在的平均负载(如果是 1 表示满负载)
第二行:Tasks: 483 total, 3 running, 480 sleeping, 0 stopped, 0 zombie
483 total进程的总数; 3 running 正在运行的进程数 , ; 480 sleeping 处于休眠状态的进程数 , ; 0
stopped停止的进程数, ; 0 zombie 僵死的进程数。
第三行:%Cpu(s): 0.3 us, 0.7 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
0.3 us表示用户进程占用 CPU 的百分比; 0.7 sy 系统进程占用 CPU 的百分比;
0.0 ni用户进程空间内改变过优先级的进程占用 CPU 的百分比; 99.0 id 空闲 CPU 占用的百分比; 0.0 wa 代 表I/Owait 表示等待输入、输出的进程占用 CPU 的百分比;
0.0 hi表示 cpu 服务于硬件中断所耗费的时间总额; 0.0 si 表示 cpu 服务于软件中断所耗费的时间总额;
0.0 st表示虚拟机被 hypervisor 偷去的 cpu 时间。另外,如果是多内核设备,可按下数字键 “1” 来切换成不 同cpu 的负载率。
MiB Mem : 1790.0 total, 1278.5 free, 240.5 used, 271.0 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 1393.8 avail Mem
total系统的内存大小; free 目前空余内存大小; used已经使用的内存大小
进程信息区:显示了每个进程的运行状态
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 179104 13540 8728 S 0.0 0.7 0:01.22 systemd
PID:进程的 id USER :进程所有者的用户名 PR :进程优先级 NI : nice 值。负值表示高优先级,正值表示 低优先级 VIRT :进程使用的虚拟内存总量,单位为 KB RES :进程使用的、未被换出的物理内存大小,单 位KB SHR :共享内存大小,单位 KB S :进程状态, D 表示不可中断的睡眠状态, R 表示运行状态, S 表示 睡眠状态,T 表示跟踪 / 停止, Z 表示僵死进程 %CPU :上次更新到现在的 CPU 时间占用百分比 %MEM :进 程占用的物理内存百分比 TIME+ :进程总计使用的 CPU 时间,单位为 1/100 秒 COMMAND :正在运行进程的命令名或者命令路径
在 top 执行过程中可以使用的按键命令:

11.6 信号控制进程
给进程发送信号
[root@localhost ~]# kill -l #列出所有支
持的信号
编号 信号名
1) SIGHUP 重新加载配置
2) SIGINT 键盘中断^C
3) SIGQUIT 键盘退出
9) SIGKILL 强制终止
15) SIGTERM 终止(正常结束),缺省信号
18) SIGCONT 继续
19) SIGSTOP 停止
20)SIGTSTP 暂停^Z
[root@localhost ~]# killall vim #给所有vim进程发送信号
[root@localhost ~]# killall httpd
11.7 作业控制
作业控制是一个命令行功能,允许一个 shell 实例来运行和管理多个命令。如果没有作业控制,父进程 fork() 一个子进程后,将sleeping ,直到子进程退出。使用作业控制,可以选择性暂停,恢复,以及异步运行命令,让 shell 可以在 子进程运行期间返回接受其他命令。
foreground: 前台进程是在终端中运行的命令,该终端为进程的控制终端。前台进程接收键盘产生的输入和信号,并 允许从终端读取或写入到终端。 background: 后台进程没有控制终端,它不需要与终端交互。
[root@localhost ~]# sleep 3000 & #运行程序(时),让其在后台执行
[root@localhost ~]# sleep 4000 #ctrl+z可以将前台的任务放到后台中暂停
[2]+ Stopped sleep 4000
[root@localhost ~]# ps aux |grep sleep
root 8895 0.0 0.0 100900 556 pts/0 S 12:13 0:00 sleep 3000
root 8896 0.0 0.0 100900 556 pts/0 T 12:13 0:00 sleep 4000
#查看当前终端放在后台的进程( jobs )
[root@localhost ~]# jobs
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
+表示最近被放到后台的工作,-表示最近第二个被放到后台中的工作,超过第三个就不会有+/-符号存在了
[root@localhost ~]# bg %2 #让作业2在后台继续运行
[root@localhost ~]# fg %1 #将作业1调回到前台
[root@localhost ~]# kill %1 #kill 1,终止工作号为1的进程
在后台执行的指令如果有 stdout 和 stderr 时,它的信息依旧是输出到屏幕上的,所以如果想将任务放在后台工作并且不希望在前台显示可以利用重定向,将输出的信息保存至某个文件
[root@localhost ~]# (while :; do date; sleep 2; done) & #进程在后台运行,但输出依然在当前终端
[root@localhost ~]# (while :; do date; sleep 2; done) &>/dev/null &