当前位置: 首页 > news >正文

Linux 软件安装和进程管理

软件安装和进程管理

  • 一、软件安装
    • 1.1 源码安装
      • 1. 下载源码包
      • 2. 配置仓库并挂载(本地仓库即可)
      • 3. 安装 c 语言的编译环境 dnf install -y make gcc*
      • 4. 源码安装软件
      • 源码安装总结
    • 1.2 rpm 包安装
      • 1. 下载 rpm 包
      • 2. rpm -ivh 安装
    • 1.3 yum/dnf 安装
      • 1. 确保本地仓库或网络仓库可用
        • 配置本地源
        • 配置网络源
      • 2. 安装软件 yum/dnf install
        • 删除所安装的软件
        • yum/dnf命令用法
  • 二、进程管理
    • 2.1 概念
      • 查看二进制文件的内容
    • 2.2 进程分类
    • 2.3 运行程序
    • 2.4 查看进程
      • 2.4.1 ps
      • 2.4.2 top
    • 2.5 终止进程 kill
    • 2.6 进程转换(jobs、bg、fg)

一、软件安装

在 Linux 中安装软件分为以下三种方式:

  • 源码安装
  • rpm 包安装
  • yum/dnf 安装

1.1 源码安装

源码安装流程:

  1. 软件准备:下载 源码包 到本机,并解压到创建的安装目录中去

    下载源码包:通常可以通过以下几种方式获取:

    • 官方网站:大多数开源项目都会在他们的官方网站上提供源码包下载链接。 请确保从官方渠道下载,以保证源码的安全性和完整性
      • 打开软件官方网站(eg. Nginx 官网 nginx.org、Python 官网 python.org)
      • 找到源码包下载链接(通常以 .tar.gz、.tar.xz、.zip 等格式结尾,如 nginx-1.25.3.tar.gz)
      • 用 wget 或 curl 命令下载(需先安装对应工具,如 sudo apt install wget 或 sudo yum install wget)
    • 代码托管平台:如 GitHub、GitLab 等平台。 你可以通过克隆(clone)或下载压缩包的方式获取源码
      • 访问软件的 GitHub 仓库(如 Redis 仓库 github.com/redis/redis)
      • 点击 “Code” 按钮,选择 “Download ZIP” 下载源码压缩包;或用 git 克隆仓库(适合需要最新开发版或后续需修改源码的场景)
    • 软件包管理器:一些系统的包管理器也支持下载源码包,例如 Debian 的 apt-get source 命令
  2. 进入解压目录去安装软件:

    1. 安装前准备工作:配置仓库并挂载(在 /etc/yum.repos.d 目录下去新一个后缀为 .repo 的文件)

      • vim /etc/yum.repos.d/xxx.repo,配置仓库
      • mount /dev/sr0 /mnt,临时挂载
        vim /etc/fstab,自动挂载
    2. 先安装 c 语言的编译环境

      • dnf install -y make gcc*
    3. 安装 tree-2.0.4 软件

      • 切换到软件目录下:cd /test/tree-2.0.4/

      • 在解压目录中执行 make 命令来进行编译

      • 在解压目录中执行 make install 命令来进行安装

      • 验证安装

1. 下载源码包

eg. tree-2.0.4.tgz 的源码包官方网址:https://pkgs.org/download/tree/https://www.linuxfromscratch.org/blfs/view/svn/general/tree.html

在这里插入图片描述

找到源码包下载链接(通常以 .tar.gz、.tar.xz、.zip 等格式结尾,如 nginx-1.25.3.tar.gz),用 wget 或 curl 命令下载

软件准备、进入解压目录去安装软件:

[root@jock ~]# ll
total 60
-rw-r--r--. 1 root root 59172 Feb 22 15:43 tree-2.0.4.tgz# 创建一个目录
[root@jock ~]# mkdir /test
# 将上传的文件移动到此目录中
[root@jock ~]# mv tree-2.0.4.tgz /test# 切换到创建的目录
[root@jock ~]# cd /test
[root@jock test]# ll
total 60
-rw-r--r--. 1 root root 59172 Feb 22 15:43 tree-2.0.4.tgz
# 解压上传的文件
[root@jock test]# tar -xzvf tree-2.0.4.tgz 
tree-2.0.4/CHANGES
tree-2.0.4/INSTALL
.....
# 验证解压
[root@jock test]# ll
total 64
drwxr-xr-x. 3 root root  4096 Feb 22 15:45 tree-2.0.4
-rw-r--r--. 1 root root 59172 Feb 22 15:43 tree-2.0.4.tgz# 进入到解压目录中
[root@jock test]# cd tree-2.0.4/
[root@jock tree-2.0.4]# ll
total 204
-rw-r--r--. 1 4437 users 18101 Sep  6  2022 CHANGES
-rw-r--r--. 1 4437 users 15968 Jun 16  2022 color.c
drwxr-xr-x. 2 root root     71 Feb 22 15:45 doc
-rw-r--r--. 1 4437 users  5241 Jun 16  2022 file.c
-rw-r--r--. 1 4437 users  4531 Aug 27  2022 filter.c
-rw-r--r--. 1 4437 users  3118 Jun 16  2022 hash.c
-rw-r--r--. 1 4437 users  6283 Jun 16  2022 html.c
-rw-r--r--. 1 4437 users  4610 Jun 16  2022 info.c
-rw-r--r--. 1 4437 users   597 Jan  4  2018 INSTALL
-rw-r--r--. 1 4437 users  5877 Aug 30  2022 json.c
-rw-r--r--. 1 4437 users 18009 Aug 13  2004 LICENSE
-rw-r--r--. 1 4437 users  7009 Aug 27  2022 list.c
-rw-r--r--. 1 4437 users  2918 Sep  6  2022 Makefile
-rw-r--r--. 1 4437 users  8372 Aug 27  2022 README
-rw-r--r--. 1 4437 users  5346 Apr 14  2021 strverscmp.c
-rw-r--r--. 1 4437 users   853 Dec 21  2021 TODO
-rw-r--r--. 1 4437 users 38706 Sep  5  2022 tree.c
-rw-r--r--. 1 4437 users  8646 Jun 16  2022 tree.h
-rw-r--r--. 1 4437 users  3166 Jun 16  2022 unix.c
-rw-r--r--. 1 4437 users  5207 Aug 27  2022 xml.c

由于系统中自带了 tree 命令,通过 dnf 命令来把它删除掉。

[root@jock tree-2.0.4]# dnf remove tree -y			# remove 表示删除文件   -y 表示删除时不提示确认
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register.Dependencies resolved.
============================================================================================================================================================Package                          Architecture                       Version                                    Repository                             Size
============================================================================================================================================================
Removing:tree                             x86_64                             1.8.0-10.el9                               @anaconda                             113 kTransaction Summary
============================================================================================================================================================
Remove  1 PackageFreed space: 113 k
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                                                                                                    1/1 Erasing          : tree-1.8.0-10.el9.x86_64                                                                                                           1/1 Running scriptlet: tree-1.8.0-10.el9.x86_64                                                                                                           1/1 Verifying        : tree-1.8.0-10.el9.x86_64                                                                                                           1/1 
Installed products updated.Removed:tree-1.8.0-10.el9.x86_64                                                                                                                                  Complete!# 验证删除是否成功
[root@jock tree-2.0.4]# tree
-bash: /usr/bin/tree: No such file or directory

安装 tree-2.0.4 软件:

先安装 c 语言的编译环境

# 由于程序是使用 c 语言编写的,我们在进行源码安装时,需要先进行编译,而编译 c 语言时需要有它的环境,因此我们需要先安装 c 语言的编译环境。通过执行如下的命令来安装这个环境。
[root@jock tree-2.0.4]# dnf install -y make gcc*
# dnf install 这个命令表示要安装软件
# dnf remove 表示删除软件
# -y 表示安装时不提示确认,直接安装
# make 表示要安装的软件
# gcc* 表示要安装以 gcc 开头的所有软件

注意:执行上面的命令时,出现了如下的错误:

[root@jock tree-2.0.4]# dnf install -y make gcc*
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register.Error: There are no enabled repositories in "/etc/yum.repos.d", "/etc/yum/repos.d", "/etc/distro.repos.d".

这个错误没有仓库地址。因此,需要去配置一个仓库。需要在 /etc/yum.repos.d 目录下去新一个后缀为 .repo 的文件

2. 配置仓库并挂载(本地仓库即可)

# vim /etc/yum.repos.d/base.repo
# 文件的内容如下:
[base]					# 名称,在整个文件中要唯一
name=base				# 仓库名称,一般设置为上面的名称,因为唯一
baseurl=/mnt/BaseOS		# 这个仓库对应的地址
gpgcheck=0				#  是否需要校验,0 表示不校验,如果为 1 则表示要校验,需要指定文件的校验地址[app]
name=app
baseurl=/mnt/AppStream
gpgcheck=0

然后再把光盘挂载到 /mnt 目录下:

mount /dev/sr0 /mnt:临时挂载,下次开机时需重新挂载

[root@jock yum.repos.d]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: source write-protected, mounted read-only.[root@jock yum.repos.d]# ls /mnt
AppStream  BaseOS  EFI  EULA  extra_files.json  GPL  images  isolinux  media.repo  RPM-GPG-KEY-redhat-beta  RPM-GPG-KEY-redhat-release

也可以修改 /etc/fstab文件,在这个文件中进行自动挂载

[root@jock yum.repos.d]# vim /etc/fstab/dev/mapper/rhel_bogon-root /                       xfs     defaults        0 0
UUID=98e55bfe-116c-411f-956c-d3e925b515c5 /boot                   xfs     defaults        0 0
/dev/mapper/rhel_bogon-swap none                    swap    defaults        0 0/dev/nvme0n2p2  /opt/mydisk2    xfs     defaults        0       0       
/dev/sr0        /mnt    iso9660 defaults        0       0

3. 安装 c 语言的编译环境 dnf install -y make gcc*

执行完上面的仓库配置后,再次来安装 c 语言的运行环境:

[root@jock yum.repos.d]# dnf install -y make gcc*
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register.base                                                                                                                        106 MB/s | 1.7 MB     00:00    
app                                                                                                                          77 MB/s | 6.3 MB     00:00    
Dependencies resolved.
============================================================================================================================================================Package                                               Architecture               Version                                    Repository                Size
============================================================================================================================================================
Installing:gcc                                                   x86_64                     11.3.1-4.3.el9                             app                       32 Mgcc-c++                                               x86_64                     11.3.1-4.3.el9                             app                       13 Mgcc-gfortran                                          x86_64                     ...............................zlib-devel                                            x86_64                     1.2.11-39.el9                              app                       47 kTransaction Summary
============================================================================================================================================================
Install  77 PackagesTotal size: 227 M
Installed size: 784 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing        :                                                                                                                                    1/1 Installing       : libquadmath-11.3.1-4.3.el9.x86_64                             ..................................                                      
Installed products updated.Installed:annobin-11.05-1.el9.x86_64                                                  boost-regex-1.75.0-8.el9.x86_64                                              dwz-0.14-3.el9.x86_64                                                       efi-srpm-macros-6-2.el9_0.noarch                                             environment-modules-5.0.1-2.el9.x86_64                                      fonts-srpm-macros-1:2.0.5-7.el9.1.noarch                                     gcc-11.3.1-4.3.el9.x86_64                                                   gcc-c++-11.3.1-4.3.el9.x86_64                                                
..............................                      gcc-toolset-12-offload-nvptx-12.2.1-7.4.el9.x86_64                          gcc-toolset-12-runtime-12.0-6.el9.x86_64                                     ghc-srpm-macros-1.5.0-6.el9.noarch                                          glibc-devel-2.34-60.el9.x86_64                                               glibc-headers-2.34-60.el9.x86_64                                            gmp-c++-1:6.2.0-10.el9.x86_64                                                gmp-devel-1:6.2.0-10.el9.x86_64                                             go-srpm-macros-3.2.0-1.el9.noarch                                            
.......................                               zlib-devel-1.2.11-39.el9.x86_64                                            Complete!

看到以上的信息表示 c 语言的编译环境就已经安装好了

4. 源码安装软件

前提:安装环境,执行 dnf install -y make gcc*

安装 tree-2.0.4 软件:

  1. 切换到软件目录下:cd /test/tree-2.0.4/
  2. 在解压目录中执行 make 命令来进行编译
  3. 在解压目录中执行 make install 命令来进行安装
  4. 验证安装
[root@jock yum.repos.d]# cd /test/tree-2.0.4/
[root@jock tree-2.0.4]# ll
total 204
-rw-r--r--. 1 4437 users 18101 Sep  6  2022 CHANGES
-rw-r--r--. 1 4437 users 15968 Jun 16  2022 color.c
drwxr-xr-x. 2 root root     71 Feb 22 15:45 doc
-rw-r--r--. 1 4437 users  5241 Jun 16  2022 file.c
-rw-r--r--. 1 4437 users  4531 Aug 27  2022 filter.c
-rw-r--r--. 1 4437 users  3118 Jun 16  2022 hash.c
-rw-r--r--. 1 4437 users  6283 Jun 16  2022 html.c
-rw-r--r--. 1 4437 users  4610 Jun 16  2022 info.c
-rw-r--r--. 1 4437 users   597 Jan  4  2018 INSTALL
-rw-r--r--. 1 4437 users  5877 Aug 30  2022 json.c
-rw-r--r--. 1 4437 users 18009 Aug 13  2004 LICENSE
-rw-r--r--. 1 4437 users  7009 Aug 27  2022 list.c
-rw-r--r--. 1 4437 users  2918 Sep  6  2022 Makefile
-rw-r--r--. 1 4437 users  8372 Aug 27  2022 README
-rw-r--r--. 1 4437 users  5346 Apr 14  2021 strverscmp.c
-rw-r--r--. 1 4437 users   853 Dec 21  2021 TODO
-rw-r--r--. 1 4437 users 38706 Sep  5  2022 tree.c
-rw-r--r--. 1 4437 users  8646 Jun 16  2022 tree.h
-rw-r--r--. 1 4437 users  3166 Jun 16  2022 unix.c
-rw-r--r--. 1 4437 users  5207 Aug 27  2022 xml.c# 在解压目录中执行 make 命令来进行编译
[root@jock tree-2.0.4]# make
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o tree.o tree.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o list.o list.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o hash.o hash.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o color.o color.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o file.o file.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o filter.o filter.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o info.o info.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o unix.o unix.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o xml.o xml.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o json.o json.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o html.o html.c
gcc -O3 -pedantic -Wall -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -c -o strverscmp.o strverscmp.c
gcc  -o tree tree.o list.o hash.o color.o file.o filter.o info.o unix.o xml.o json.o html.o strverscmp.o# 在解压目录中执行 make install 命令来进行安装
[root@jock tree-2.0.4]# make install
install -d /usr/local/bin
install -d /usr/local/man/man1
install tree /usr/local/bin/tree; \
install -m 644 doc/tree.1 /usr/local/man/man1/tree.1# 清空 hash 表
[root@jock tree-2.0.4]# hash -r# 验证安装
[root@jock ~]# cd /test
[root@jock test]# tree
.
├── tree-2.0.4
│   ├── CHANGES
│   ├── color.c
│   ├── color.o
│   ├── doc
│   │   ├── global_info
│   │   ├── tree.1
│   │   ├── tree.fr.1
│   │   └── xml.dtd
│   ├── file.c
│   ├── file.o
│   ├── filter.c
│   ├── filter.o
│   ├── hash.c
│   ├── hash.o
│   ├── html.c
│   ├── html.o
│   ├── info.c
│   ├── info.o
│   ├── INSTALL
│   ├── json.c

从上面的结果可以发现:源码安装 tree 命令是成功的。

源码安装总结

  1. 需要有 c 语言编译环境

    1. 配置本地仓库,需要在 /etc/yum.repos.d 目录下新建一个创建文件,如: base.repo,并在这个文件中配置 BaseOS 和 AppStream 路径
    2. 挂载光盘
    3. 安装环境,执行 dnf install -y make gcc*
    
  2. 源码安装

    1. 在解压目录下执行 make 命令来进行编译
    2. 在解压目录下执行 make install 命令来进行安装
    

1.2 rpm 包安装

RPM 是红帽包管理(Redhat Package Manager)的缩写,由 Red Hat 公司提出的一种软件包管理标准,是 Linux 各发行版中应用最广泛的软件包格式之一

RPM软件包的典型命名格式:软件名-版本号-发行号.操作系统版本.硬件平台的类型.rpm,比如 zsh-5.0.2-14.el7.x86_64.rpm

zsh-50214el7x8664
软件名主版本号次版本号修订号软件发布次数发行商RHEL7CPU架构平台支持系统位数
  1. 通过 镜像网站 下载 rpm 包
    • https://developer.aliyun.com/mirror/ 寻找需要的 rpm 包
    • 复制 rpm 格式对应的网址链接(eg.https://mirrors.aliyun.com/almalinux/10.0/CRB/s390x/kickstart/Packages/apache-resource-bundles-1.5-8.el10.noarch.rpm
    • 通过 curl -o apache-resource-bundles.rpm https://mirrors.aliyun.com/almalinux/10.0/CRB/s390x/kickstart/Packages/apache-resource-bundles-1.5-8.el10.noarch.rpm 下载 rpm 到本机
    • 或者 curl https://mirrors.aliyun.com/almalinux/10.0/CRB/s390x/kickstart/Packages/apache-resource-bundles-1.5-8.el10.noarch.rpm 111/apache-resource-bundles-1.5-8.el10.noarch.rpm (安装路径)
  2. 安装(前提:软件所需要的依赖软件需存在):
    • rpm -ivh xxx.rpm
      • i:install 安装
      • v:提供更多的详细信息输出
      • h:在安装过程中显示进度条

进入对应版本的仓库目录(通常路径为 Packages/os/Packages/),根据软件名和架构(如 x86_64aarch64)查找对应的 .rpm 文件,直接下载即可:

阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区:https://developer.aliyun.com/mirror/

命令执行格式:

rpm -i	install		# 安装-e	erase		# 删除-u	update		# 更新-q	query		# 查询-h 				# 在安装过程中显示进度条-v, --verbose	# 提供更多的详细信息输出安装软件包:rpm -ivh package_name.rpm
查询所有已安装的软件包:rpm -qa
查询软件包的安装信息:rpm -qi package_name
卸载软件包:rpm -e package_name
升级软件包:rpm -Uvh package_name.rpm
查询软件包的文件列表:rpm -ql package_name
查询文件属于哪个软件包:rpm -qf /path/to/file
查询软件包的依赖关系:rpm -qR package_name

下面以安装 qq 软件为例来演示 rpm 包软件的操作:

1. 下载 rpm 包

[root@jock test]# cd ~
# 下载 qq 软件安装包
[root@jock ~]# curl https://dldir1.qq.com/qqfile/qq/QQNT/ad5b5393/linuxqq_3.1.2-13107_x86_64.rpm -o ./linuxqq_3.1.2-13107_x86_64.rpm# 查看
[root@jock ~]# ll
total 122204
-rw-r--r--. 1 root root 125136548 Feb 22 16:22 linuxqq_3.1.2-13107_x86_64.rpm
# 安装
[root@jock ~]# rpm -ivh linuxqq_3.1.2-13107_x86_64.rpm 
error: Failed dependencies:libXScrnSaver is needed by linuxqq-3.1.2_13107-1.x86_64# 安装时报错了,说安装 linuxqq-3.1.2_13107-1.x86_64 软件需要依赖 libXScrnSaver# 从本地仓库中去搜索所依赖的 libXScrnSaver 软件所在位置	
[root@jock ~]# find /mnt -name libXScrnSaver
[root@jock ~]# find /mnt/AppStream/Packages/ -name "libXScrnSaver*"
/mnt/AppStream/Packages/libXScrnSaver-1.2.3-10.el9.i686.rpm
/mnt/AppStream/Packages/libXScrnSaver-1.2.3-10.el9.x86_64.rpm
/mnt/AppStream/Packages/libXScrnSaver-devel-1.2.3-10.el9.i686.rpm
/mnt/AppStream/Packages/libXScrnSaver-devel-1.2.3-10.el9.x86_64.rpm# 安装所需要的依赖
[root@jock ~]# rpm -ivh /mnt/AppStream/Packages/libXScrnSaver-1.2.3-10.el9.x86_64.rpm
warning: /mnt/AppStream/Packages/libXScrnSaver-1.2.3-10.el9.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...1:libXScrnSaver-1.2.3-10.el9       ################################# [100%]

2. rpm -ivh 安装

# 当依赖的软件安装好后,再来安装 qq
[root@jock ~]# rpm -ivh linuxqq_3.1.2-13107_x86_64.rpm 
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...1:linuxqq-3.1.2_13107-1            ################################# [100%]# 此时,QQ 就已经安装成功了# 搜索qq安装的位置
[root@jock ~]# rpm -ql linuxqq
/opt/QQ/LICENSE.electron.txt
/opt/QQ/LICENSES.chromium.html
/opt/QQ/chrome-sandbox
/opt/QQ/chrome_100_percent.pak
/opt/QQ/chrome_200_percent.pak
/opt/QQ/chrome_crashpad_handler
/opt/QQ/icudtl.dat
/opt/QQ/libEGL.so
/opt/QQ/libGLESv2.so
/opt/QQ/libffmpeg.so
.......# 卸载QQ
[root@jock ~]# rpm -evh linuxqq
Preparing...                          ################################# [100%]
Cleaning up / removing...1:linuxqq-3.1.2_13107-1            ################################# [100%]

下面再次演示安装一个在屏幕上显示字母的软件:

wget https://rpmfind.net/linux/fedora/linux/releases/38/Everything/x86_64/os/Packages/c/cmatrix-2.0-5.fc38.x86_64.rpm# 安装cmatrix软件
[root@jock ~]# rpm -ivh cmatrix-2.0-5.fc38.x86_64.rpm 
warning: cmatrix-2.0-5.fc38.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID eb10b464: NOKEY
Verifying...                          ################################# [100%]
Preparing...                          ################################# [100%]
Updating / installing...1:cmatrix-2.0-5.fc38               ################################# [100%]# 使用软件
[root@jock ~]# cmatrix
[root@jock ~]# cmatrix -C red
[root@jock ~]# cmatrix -C blue# 删除
[root@jock ~]# rpm -evh cmatrix
Preparing...                          ################################# [100%]
Cleaning up / removing...1:cmatrix-2.0-5.fc38               ################################# [100%]
..................

通过上面两个软件的安装,发现一个问题?

有些 rpm 包安装时比较方便,一下子就安装好了;而另一个软件安装时会有依赖,必须先把依赖的软件安装好后,才能安装真正要使用的软件

1.3 yum/dnf 安装

YUM (Yellow dog Updater,Modified) ,RHEL8 中默认使用的软件批量管理工具由原版本的 yum 换成了速度更快的 dnf(DNF = Dandified YUM),原有的 yum 命令仅为 dnf 的软链接,依旧可以使用

[root@jock ~]# ll `which yum`
lrwxrwxrwx. 1 root root 5 Mar 15  2023 /usr/bin/yum -> dnf-3

这个命令可以实现下载、安装、卸载、更新。而且它还可以自动去搜索被安装的软件所需要的依赖,并一起下载安装

  • 下面以安装 httpd 服务来演示如何通过 yum/dnf 来安装所需要的软件
# 1. 确保本地仓库或网络仓库可用# 2. 安装 httpd 服务软件
[root@jock ~]# dnf install httpd
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register...........................................Complete!

1. 确保本地仓库或网络仓库可用

配置本地源

在 /etc/yum.repos.d 目录下新建一个仓库文件,如 base.repo,然后在这个文件中添加如下内容:

[base]
name=base
baseurl=/mnt/BaseOS
gpgcheck=0[app]
name=app
baseurl=/mnt/AppStream
gpgcheck=0

然后将光盘挂载到 /mnt 目录下:

[root@jock html]# mount /dev/sr0 /mnt

至此,本地仓库就建立好了。

配置网络源

建立网络源(Redhat9 暂时无公开的网络源,暂不可配置,其他发行版本可自行选择对应网源仓库)

  • 阿里云网络源,aliyun 的镜像站点为 https://mirrors.aliyun.com/
  • 清华源镜像站点为 https://mirrors.tuna.tsinghua.edu.cn/
  • 中国科技大学镜像站点 https://mirrors.ustc.edu.cn/
  • 网易开源镜像站 http://mirrors.163.com/

查看系统内核版本信息:

[root@jock html]# cat /etc/os-release 
NAME="Red Hat Enterprise Linux"
VERSION="9.2 (Plow)"
ID="rhel"
ID_LIKE="fedora"
VERSION_ID="9.2"
PLATFORM_ID="platform:el9"
PRETTY_NAME="Red Hat Enterprise Linux 9.2 (Plow)"
ANSI_COLOR="0;31"
LOGO="fedora-logo-icon"
CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos"
HOME_URL="https://www.redhat.com/"
DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9"
BUG_REPORT_URL="https://bugzilla.redhat.com/"REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9"
REDHAT_BUGZILLA_PRODUCT_VERSION=9.2
REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="9.2"[root@jock html]# cat /etc/redhat-release 
Red Hat Enterprise Linux release 9.2 (Plow)

下面来配置一个网络源(仓库),以阿里的网络源为例来进行演示:

  1. 使用阿里云,进入官网网址 https://mirrors.aliyun.com/
  2. 选择镜像站
    在这里插入图片描述
  3. 搜索相应系统
    在这里插入图片描述
  4. 根据自己需求选择合适和版本
    在这里插入图片描述
  5. 最后选择到最底层后复制链接
    在这里插入图片描述

在 /etc/yum.repos.d 目录下新建一个名为 aliyun.repo 仓库文件

[root@jock yum.repos.d]# touch aliyun.repo
[root@jock yum.repos.d]# ll
total 8
-rw-r--r--. 1 root root   0 Feb 23 10:23 aliyun.repo
-rw-r--r--. 1 root root  98 Feb 22 15:59 base.repo
-rw-r--r--. 1 root root 358 Jan 25 15:05 redhat.repo

然后在这个文件中添加如下的内容:

[baseOS]
name=baseOS
baseurl=https://mirrors.aliyun.com/redhat/rhel/rhel-9-beta/baseos/x86_64/
gpgcheck=0[appStream]
name=appStream
baseurl=https://mirrors.aliyun.com/redhat/rhel/rhel-9-beta/appstream/x86_64/
gpgcheck=0

下面配置一个网易网络仓库

[tunaBaseOS]
name=tunaBaseOS
baseurl=http://mirrors.163.com/rocky/9.3/BaseOS/x86_64/os/
gpgcheck=0
[tunaAppStream]
name=tunaAppStream
baseurl=http://mirrors.163.com/rocky/9.3/AppStream/x86_64/os/
gpgcheck=0

配置好后,可以来测试一个软件,例如安装 bind 软件:

[root@jock yum.repos.d]# dnf install -y bind
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register........................................................              Complete!

可以发现,配置的 aliyun.repo 和 tuna.repo 都是生效的,说明配置是 OK 的

2. 安装软件 yum/dnf install

删除所安装的软件
[root@jock yum.repos.d]# dnf remove bind# 删除 httpd 服务
[root@jock yum.repos.d]# dnf remove -y httpd# 查看端口占用情况
[root@jock yum.repos.d]# netstat -nltup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      5433/sshd: root@pts 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1154/sshd: /usr/sbi 
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      1150/cupsd          
tcp6       0      0 :::22                   :::*                    LISTEN      1154/sshd: /usr/sbi 
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 ::1:631                 :::*                    LISTEN      1150/cupsd          
tcp6       0      0 ::1:6010                :::*                    LISTEN      5433/sshd: root@pts 
udp        0      0 0.0.0.0:44729           0.0.0.0:*                           927/avahi-daemon: r 
udp        0      0 0.0.0.0:111             0.0.0.0:*                           1/systemd           
udp        0      0 127.0.0.1:323           0.0.0.0:*                           984/chronyd         
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           927/avahi-daemon: r 
udp6       0      0 :::111                  :::*                                1/systemd           
udp6       0      0 ::1:323                 :::*                                984/chronyd         
udp6       0      0 :::5353                 :::*                                927/avahi-daemon: r 
udp6       0      0 :::38789                :::*                                927/avahi-daemon: r 
[root@jock yum.repos.d]# netstat -nltup | grep 80
yum/dnf命令用法
yum repolist [all]	# 查看系统中 yum 的资源配置信息yum list all	# 列出仓库里可安装的软件包yum list installed [包名]		# 列出已经安装的软件yum info 包名		# 查看指定软件包的详细信息yum grouplist 	# 查看仓库中所有包组yum groupinfo 包组名	#查看指定包组的信息yum install [-y] 包名		# 安装指定的包yum update [-y] 包名		# 更新指定的包yum groupinstall 组名		# 安装指定的组名包yum remove [-y] 包名		# 删除指定的包名yum provides 包名		# 查找指定的包名是由哪个提供的yum search 包名		# 查看包名在哪个软件中yum clean packages all	# 清除下载到本机的指定的软件包或yum的缓存文件

二、进程管理

2.1 概念

  • 程序二进制文件,文件存储在磁盘中,例如 /usr/bin/ 目录下

  • 进程:进程是已启动的可执行程序的运行实例

    • 进程和程序并不是 一 一 对应的关系,相同的程序运行在不同的数据集上就是不同的进程
    • 进程还具有并发性和交往,而程序却是封闭的
  • 线程:操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位

    • 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

    • 一个进程可以拥有多个线程,而一个线程同时只能被一个进程所拥有

    • 线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,它必须组成进程才能被执行

查看二进制文件的内容

在 Linux 系统中,查看二进制文件(非文本文件,如可执行程序、库文件、图像等)需要使用专门工具,因为二进制文件包含不可打印的字符,直接用 cat 等文本工具查看会显示乱码

  1. hexdump:十六进制 dump 工具

    hexdump 是最常用的二进制查看工具,默认以十六进制和 ASCII 码形式展示文件内容

    hexdump filename  # 简单输出,每行显示16字节(默认格式)1. -C:以规范格式显示(十六进制 + ASCII,每行 16 字节,中间用竖线分隔),最直观:
    hexdump -C filename
    00000000  7f 45 4c 46 02 01 01 00  00 00 00 00 00 00 00 00  |.ELF............|
    00000010  02 00 3e 00 01 00 00 00  78 00 40 00 00 00 00 00  |..>.....x.@.....|
    # 左侧是文件偏移量(十六进制)
    # 中间是十六进制数据(每个字节对应两位十六进制)
    # 右侧是可打印的 ASCII 字符(不可打印字符用 . 表示)
    2. -n N:只显示前 N 个字节:
    hexdump -C -n 64 filename  # 只显示前64字节
    
  2. xxd:更简洁的十六进制查看器

    xxdvim 自带的工具,输出格式比 hexdump 更紧凑,适合快速查看

    xxd filename  # 默认每行16字节,格式:偏移量 十六进制  ASCII
    示例输出:
    00000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
    00000010: 0200 3e00 0100 0000 7800 4000 0000 0000  ..>.....x.@.....1. -l N:限制显示前 N 个字节:
    xxd -l 32 filename  # 只显示前32字节
    2. -g 1:每个字节单独显示(默认是 2 字节一组)
    xxd -g 1 filename
    
  3. od:多格式二进制查看器

    od(octal dump)支持以八进制、十进制、十六进制等多种格式查看二进制文件,功能更灵活

    1. -t x1:以十六进制显示,每个字节一组(最常用)
    od -t x1 filename
    2. -t d1:以十进制显示每个字节
    od -t d1 filename
    3. -t o1:以八进制显示每个字节
    od -t o1 filename
    
  4. 查看二进制文件的类型

    在查看内容前,可先用 file 命令判断二进制文件的格式(如 ELF 可执行文件、PNG 图像等),帮助理解内容

2.2 进程分类

在Linux系统中,进程根据其特点可以分为三类:交互进程、批处理进程和守护进程。

  • 交互进程:交互进程是由 shell 启动的进程,可以在前台或后台运行。它们在执行过程中需要与用户进行交互操作,例如用户需要提供某些参数或信息,进程才能继续执行。

    • 交互式与非交互式(设置密码 passwd)

      • 交互式模式:就是在终端上执行,shell 等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为 shell 与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。

      • 交互式设置密码:passwd 密码

      举例:最常见的交互式shell,就是我们利用虚拟机登录Linux系统时的那个等待登录界面:系统在等待我们键入登录的用户名和密码,这就是一种交互式shell

      • 非交互式模式:是以shell script(非交互)方式执行。在这种模式 下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。

      • 非交互式设置密码:echo 密码 | --stdin passwd 密码

      举例:非交互式shell就像我们写的那些很简单的脚本,比如一个脚本展示出:helloworld。这个脚本不需要我们对其进行交互,它就只是很简单的将其脚本中的命令按顺序执行

  • 批处理进程:批处理进程与终端无关,是一个进程序列。它们通常被提交到一个作业队列中按顺序执行,例如脚本运行。

  • 守护进程:守护进程是执行特定功能或系统相关任务的后台进程。它们通常在系统启动时启动,并在后台运行,直到系统关闭时才停止运行。例如,FTP或Apache服务等。

此外,根据进程状态的不同,还可以将进程分为守护进程、孤儿进程和僵尸进程。

  • 守护进程:守护进程是后台运行的进程,通常由超级用户(用户ID为0)运行,没有控制终端,其父进程是init进程(即1号进程)。

  • 孤儿进程:孤儿进程是指其父进程退出后,仍在运行的子进程。这些子进程将被 init 进程收养,并由 init 进程完成状态收集工作。

  • 僵尸进程:僵尸进程是指子进程结束但没有完全释放内存的进程。当僵尸进程的父进程结束后,该僵尸进程将被init进程收养,最终被回收。

进程的状态也可以分为五种:运行、可中断、不可中断、僵死和停止。

  • 运行状态:进程正在运行或在运行队列中等待。

  • 可中断状态:进程处于休眠状态,等待某个条件的形成或接受到信号。

  • 不可中断状态:进程收到信号不唤醒,必须等待中断发生。

  • 僵死状态:进程已终止,但进程描述符仍存在,直到父进程调用wait4()系统调用后释放。

  • 停止状态:进程收到SIGSTOP、SIGSTP、SIGTIN或SIGTOU信号后停止运行。

2.3 运行程序

# 安装 httpd 包
[root@jock yum.repos.d]# dnf install -y httpd# 查看 httpd 的服务状态
[root@jock yum.repos.d]# systemctl status httpd
○ httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)Active: inactive (dead)		# 未启用状态Docs: man:httpd.service(8)Feb 23 10:06:15 jock systemd[1]: Starting The Apache HTTP Server...
Feb 23 10:06:15 jock httpd[6337]: AH00558: httpd: Could not reliably determine the server's fully qualified domain na>
Feb 23 10:06:15 jock httpd[6337]: Server configured, listening on: port 80
Feb 23 10:06:15 jock systemd[1]: Started The Apache HTTP Server.
Feb 23 10:51:37 jock systemd[1]: Stopping The Apache HTTP Server...
Feb 23 10:51:38 jock systemd[1]: httpd.service: Deactivated successfully.
Feb 23 10:51:38 jock systemd[1]: Stopped The Apache HTTP Server.
Feb 23 10:51:38 jock systemd[1]: httpd.service: Consumed 3.056s CPU time.# 启用 httpd 服务
[root@jock yum.repos.d]# systemctl start httpd# 查看服务的进程
[root@jock yum.repos.d]# netstat -lntup | grep httpd
tcp6       0      0 :::80                   :::*                    LISTEN      8148/httpd# 或者查看服务的状态
[root@jock yum.repos.d]# systemctl status httpd
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)Active: active (running) since Fri 2024-02-23 11:27:34 CST; 44s ago		# 启用状态Docs: man:httpd.service(8)Main PID: 8148 (httpd)Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"Tasks: 213 (limit: 48630)Memory: 37.1MCPU: 94msCGroup: /system.slice/httpd.service├─8148 /usr/sbin/httpd -DFOREGROUND├─8151 /usr/sbin/httpd -DFOREGROUND├─8152 /usr/sbin/httpd -DFOREGROUND├─8153 /usr/sbin/httpd -DFOREGROUND└─8154 /usr/sbin/httpd -DFOREGROUNDFeb 23 11:27:34 jock systemd[1]: Starting The Apache HTTP Server...
Feb 23 11:27:34 jock httpd[8148]: AH00558: httpd: Could not reliably determine the server's fully qualified domain na>
Feb 23 11:27:34 jock httpd[8148]: Server configured, listening on: port 80
Feb 23 11:27:34 jock systemd[1]: Started The Apache HTTP Server.# 停止httpd服务
[root@jock yum.repos.d]# systemctl stop httpd
# 查看进程
[root@jock yum.repos.d]# netstat -lntup | grep httpd
# 查看服务状态
[root@jock yum.repos.d]# systemctl status httpd
○ httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)Active: inactive (dead)Docs: man:httpd.service(8)Feb 23 10:51:38 jock systemd[1]: httpd.service: Deactivated successfully.
Feb 23 10:51:38 jock systemd[1]: Stopped The Apache HTTP Server.
Feb 23 10:51:38 jock systemd[1]: httpd.service: Consumed 3.056s CPU time.
Feb 23 11:27:34 jock systemd[1]: Starting The Apache HTTP Server...
Feb 23 11:27:34 jock httpd[8148]: AH00558: httpd: Could not reliably determine the server's fully qualified domain na>
Feb 23 11:27:34 jock httpd[8148]: Server configured, listening on: port 80
Feb 23 11:27:34 jock systemd[1]: Started The Apache HTTP Server.
Feb 23 11:29:43 jock systemd[1]: Stopping The Apache HTTP Server...
Feb 23 11:29:44 jock systemd[1]: httpd.service: Deactivated successfully.
Feb 23 11:29:44 jock systemd[1]: Stopped The Apache HTTP Server.# 重启 httpd 服务
[root@jock yum.repos.d]# systemctl restart httpd# 将 httpd 服务加入到开机启动列表,即系统一运行程序就运行
[root@jock yum.repos.d]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.# 将 httpd 服务从开机列表中删除
[root@jock yum.repos.d]# systemctl disable --now httpd
Removed "/etc/systemd/system/multi-user.target.wants/httpd.service".

2.4 查看进程

2.4.1 ps

ps 显示某个时间点的程序运行情况

-a :显示所有用户的进程
-u :显示用户名和启动时间
-x :显示没有控制终端的进程
-e :显示所有进程,包括没有控制终端的进程
-l :长格式显示
-w:宽行显示,可以使用多个 w 进行加宽显示 
-f:做一个更完整的输出

使用示例:

# 查看当前用户的进程
[root@jock yum.repos.d]# ps -l
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0    5442    5433  0  80   0 - 56188 do_wai pts/0    00:00:00 bash
4 R     0    8917    5442  0  80   0 - 56370 -      pts/0    00:00:00 ps
命令结果说明:
F:代表这个程序的标示(Flag),常见的值有:4:表示此程序的权限为root;1:表示此子程序仅进行复制(fork)而没有实际执行(exec)
S:代表这个程序的状态(Stat),主要有如下的状态:- R(Running):该程序处于运行状态- S(Sleep):该程序处理眨眼状态,但是可以唤醒- D:该程序处于不可唤醒的状态- T(Stop):该程序处于停止状态- Z(Zombie):该程序处于僵尸状态- + :表示它是一个进程组
UID/PID/PPID:代表用户的uid,进程pid和它的父id
C:代码 CPU 的使用率,单位为百分比
PRI/NI:进程的优先级,值越少表示该程序越快被 CPU 执行
ADDR/SZ/WCHAN:它们是与内存相关的,ADDR 是内核,SZ 内存使用多少,WCHAN表示是否在运行中
TTY:表示终端信息
TIME:使用的 CPU 时间
CMD:触发此进程的指令是什么
# 查看所有用户执行的进程的详细信息
[root@jock yum.repos.d]# ps -le
F S   UID     PID    PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0       1       0  0  80   0 - 43879 ep_pol ?        00:00:02 systemd
1 S     0       2       0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 I     0       3       2  0  60 -20 -     0 rescue ?        00:00:00 rcu_gp
1 I     0       4       2  0  60 -20 -     0 rescue ?        00:00:00 rcu_par_gp
1 I     0       5       2  0  60 -20 -     0 rescue ?        00:00:00 slub_flushwq
1 I     0       6       2  0  60 -20 -     0 rescue ?        00:00:00 netns
1 I     0       8       2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:0H-events_highpri
1 I     0      10       2  0  60 -20 -     0 worker ?        00:00:00 kworker/0:1H-events_highpri
1 I     0      11       2  0  60 -20 -     0 rescue ?        00:00:00 mm_percpu_wq
1 I     0      13       2  0  80   0 -     0 rcu_ta ?        00:00:00 rcu_tasks_kthre
.....# 查看当前用户的进程
[root@jock yum.repos.d]# ps -u
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        5442  0.0  0.0 224752  6380 pts/0    Ss   09:00   0:00 -bash
root        8921  0.0  0.0 225480  3552 pts/0    R+   11:49   0:00 ps -u
# 工作中使用的选项
[root@jock yum.repos.d]# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 175516 19772 ?        Ss   09:00   0:02 /usr/lib/systemd/systemd rhgb --switched-root --sys
root           2  0.0  0.0      0     0 ?        S    09:00   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   09:00   0:00 [rcu_gp][root@jock yum.repos.d]# ps -aux | head
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 175516 19772 ?        Ss   09:00   0:02 /usr/lib/systemd/systemd rhgb --switched-root --system --deserialize 31
root           2  0.0  0.0      0     0 ?        S    09:00   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   09:00   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   09:00   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I<   09:00   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I<   09:00   0:00 [netns]
root           8  0.0  0.0      0     0 ?        I<   09:00   0:00 [kworker/0:0H-events_highpri]
root          10  0.0  0.0      0     0 ?        I<   09:00   0:00 [kworker/0:1H-events_highpri]
root          11  0.0  0.0      0     0 ?        I<   09:00   0:00 [mm_percpu_wq]

字段说明:

  • USER:进行进程的用户
  • PID:进程的ID
  • %CPU:CPU的占用率
  • %MEM:内存占用率
  • VSZ:占用虚拟内存情况
  • RSS:占用实际内存情况,它是需要驻留内存 TTY:进程运行的终端 STAT:进程状态,
    • S:可中断的睡眠
    • I:以线程运行方式运行
    • s:进程的领导者,即父进程
    • R:运行
    • D:不可中断的睡眠
    • T:停止 START:进程的启动时间 TIME:进程占用的CPU总时间 COMMAND:进程触发的命令
[root@jock yum.repos.d]# ps -ef | grep httpd
root        8655       1  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8656    8655  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8657    8655  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8658    8655  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8659    8655  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root        8929    5442  0 11:56 pts/0    00:00:00 grep --color=auto httpd# 查看指定进程的PID
[root@jock yum.repos.d]# pgrep -l httpd
8655 httpd
8656 httpd
8657 httpd
8658 httpd
8659 httpd
[root@jock yum.repos.d]# pidof httpd
8659 8658 8657 8656 8655

2.4.2 top

这个命令也是查看进程的,它的语法格式如下:

[root@jock yum.repos.d]# man toptop [-d 数字] | [-bnp]常用的选项:
-d 后面可以接秒数,就是整个进程界面更新的秒数,默认是5秒
-b 以批次的方式执行 top,还可以有更多的参数可用
通常会搭配数据流重定向来将批量处理的结果输出到指定的文件中
-n 与-b搭配,进行几次top的输出结果
-i 不显示闲置或者僵死的进程信息
-c 显示进程整个的命令路径,而不是只显示命令名称
-s 使top命令在安全模式下运行
-p 指定某些pid来进行查看

使用示例

# 通过 top 命令来查看进程,每隔山3秒钟进行就会刷新一次
[root@jock yum.repos.d]# top -d 3
top - 14:15:00 up  5:15,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 304 total,   1 running, 303 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
MiB Mem :   7661.0 total,   6096.9 free,   1097.0 used,    750.3 buff/cache
MiB Swap:   5120.0 total,   5120.0 free,      0.0 used.   6564.0 avail Mem PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           944 root      20   0  529976   9064   7468 S   0.3   0.1   0:16.17 vmtoolsd                         8658 apache    20   0 2258896  15024   5740 S   0.3   0.2   0:02.05 httpd                                                         

top的输出可以分为统计信息区进程信息区两个部分,即前面 5 行属于统计信息区,而后面的内容属于进程信息区。

  • 统计信息区
第一行为任务队列信息:top - 14:15:00 up  5:15,  1 user,  load average: 0.00, 0.00, 0.0014:15:00 执行此命令的当前系统时间
up  5:15 表示系统已经启动 5 小时 15 分钟
1 user 表示当前的登录用户数
load average: 0.00, 0.00, 0.00  表示系统1分钟,5分钟,15分钟前到现在的平均负载第二行为任务信息:Tasks: 304 total,   1 running, 303 sleeping,   0 stopped,   0 zombie
304 total 进程总数
1 running 正在运行的进程数
303 sleeping 处于睡眠的进程数
0 stopped 处于停止的进程数
0 zombie 僵尸进程数第三行是进程的占用信息:%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
0.0 us  表示用户进程占用CPU的百分比
0.1 sy  表示系统进程占用CPU的百分比
0.0 ni  用户进程空间内改变过优先级的进程占用CPU的百分比
99.8 id 空闲CPU占用百分比
0.0 wa 代表I/O等待输入/输出的进程占用CPU的百分比
0.1 hi 表示CPU服务于硬件中断所耗费的时间总额
0.0 si 表示CPU服务于软件中断所耗费的时间总额
0.0 st 表示虚拟机被hypervisor偷去的CPU时间第四行内存使用情况:MiB Mem :   7661.0 total,   6096.9 free,   1097.0 used,    750.3 buff/cache
7661.0 total  内存总共大小
6096.9 free   内存可用大小
1097.0 used   内存已使用大小
750.3 buff/cache  缓存大小第五行交换空间使用情况:MiB Swap:   5120.0 total,   5120.0 free,      0.0 used.   6564.0 avail Mem
  • 进程信息区

在这个区域中显示的是每个进程的运行状态,这些状态的字段含义与 ps 命令执行后的含义相同。

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           
944 root      20   0  529976   9064   7468 S   0.3   0.1   0:16.17 vmtoolsdPID  进行的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 正在运行的进程的命令名或命令路径

2.5 终止进程 kill

终止进程可以使用 kill 命令,这个命令名可以使用 kill -l 来查看所以可列出的支持信号

[root@jock yum.repos.d]# kill -l
1) SIGHUP    重新加载配置
2) SIGINT    键盘中断^C
3) SIGQUIT   键盘退出
4) SIGILL
5) SIGTRAP
6) SIGABRT
7) SIGBUS
8) SIGFPE
9) SIGKILL   强制终止
10) SIGUSR1
11) SIGSEGV
12) SIGUSR2	
13) SIGPIPE	
14) SIGALRM	
15) SIGTERM   终止(正常结束),缺省信号
16) SIGSTKFLT	
17) SIGCHLD	
18) SIGCONT	  继续
19) SIGSTOP	  停止
20) SIGTSTP   暂停^Z
21) SIGTTIN	
22) SIGTTOU	
23) SIGURG	
24) SIGXCPU	
25) SIGXFSZ
26) SIGVTALRM	
27) SIGPROF	
28) SIGWINCH	
29) SIGIO	
30) SIGPWR
31) SIGSYS	
34) SIGRTMIN	
35) SIGRTMIN+1	
36) SIGRTMIN+2	
37) SIGRTMIN+3
38) SIGRTMIN+4	
39) SIGRTMIN+5	
40) SIGRTMIN+6	
41) SIGRTMIN+7	
42) SIGRTMIN+8
43) SIGRTMIN+9	
44) SIGRTMIN+10	
45) SIGRTMIN+11	
46) SIGRTMIN+12	
47) SIGRTMIN+13
48) SIGRTMIN+14	
49) SIGRTMIN+15	
50) SIGRTMAX-14	
51) SIGRTMAX-13	
52) SIGRTMAX-12
53) SIGRTMAX-11	
54) SIGRTMAX-10	
55) SIGRTMAX-9	
56) SIGRTMAX-8	
57) SIGRTMAX-7
58) SIGRTMAX-6	
59) SIGRTMAX-5	
60) SIGRTMAX-4	
61) SIGRTMAX-3	
62) SIGRTMAX-2
63) SIGRTMAX-1	
64) SIGRTMAX	

在实际使用中,用得多的就是信号9,通常用它来强制终止某个进程。使用的格式为:

kill -9 进程ID或者killall             # 来终止所有的进程还可以使用
killall 程序名称     # 来终止指定程序

使用示例:

# 1. 在窗口A中执行vim命令
[root@jock yum.repos.d]# vim# 2. 在窗口B中查看vim进程
[root@jock ~]# ps -ef | grep vim
root        9119    5442  0 14:50 pts/0    00:00:00 vim
root        9121    9069  0 14:50 pts/1    00:00:00 grep --color=auto vim
# 3. 在窗口B中终止vim进程
[root@jock ~]# killall vim# 4. 在窗口A中可发现vim进程已经退出
Vim: Caught deadly signal TERM
Vim: Finished.Terminated# 根据PID值来终止进程
# 1. 启动服务
[root@jock ~]# systemctl start httpd
# 2. 查看服务的PID值
[root@jock ~]# ps -ef | grep httpd
root        8655       1  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8656    8655  0 11:33 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      8657    8655  0 11:33 ?        00:00:03 /usr/sbin/httpd -DFOREGROUND
apache      8658    8655  0 11:33 ?        00:00:02 /usr/sbin/httpd -DFOREGROUND
apache      8659    8655  0 11:33 ?        00:00:02 /usr/sbin/httpd -DFOREGROUND
root        9129    9069  0 14:54 pts/1    00:00:00 grep --color=auto httpd
# 3. 根据PID值为终止进程
[root@jock ~]# kill -9 8655
# 4. 验证是否已经成功终止指定的进程
[root@jock ~]# ps -ef | grep httpd
root        9134    9069  0 14:56 pts/1    00:00:00 grep --color=auto http

2.6 进程转换(jobs、bg、fg)

进程转换通常是把前台进程转换为后台进程或者把后台进程转换为前台进程。

  • 通过在命令后带上 & 符号,就可以把前台进程转换为后台进程
  • 使用 ctrl+z 来将前台进程转换为后台进程
# 1. 前台进程转换为后台进程
[root@jock ~]# sleep 3000
adfa
asdfa
aasdf
adfa
[root@jock ~]# sleep 3000 &
[1] 9138
[root@jock ~]# 
# 可以发现,通过在命令后带上 & 符号,就可以把前台进程转换为后台进程。# 除此以外,我们还可以使用 ctrl+z 来将前台进程转换为后台进程
[root@jock yum.repos.d]# sleep 3000
^Z
[2]+  Stopped                 sleep 3000[root@jock ~]# ps aux | grep sleep
root        9138  0.0  0.0 220952  1020 pts/1    S    15:00   0:00 sleep 3000
root        9178  0.0  0.0 220952  1020 pts/0    S    15:04   0:00 sleep 3000
root        9181  0.0  0.0 220952  1020 pts/0    T    15:04   0:00 sleep 3000
root        9183  0.0  0.0 221664  2284 pts/1    S+   15:05   0:00 grep --color=auto sleep

如果希望查看后台的进程,需要使用 jobs 命令

[root@jock yum.repos.d]# jobs -l
[1]-  9178 Running                 sleep 3000 &
[2]+  9181 Stopped                 sleep 3000+ 表示最后被放到后台的进程
- 表示最后第二个被放到后台的进程

如果我们希望某个后台停止进程再次运行,需要使用 bg 命令,它的使用格式为:bg %编号

[root@jock yum.repos.d]# jobs -l
[1]-  9178 Running                 sleep 3000 &
[2]+  9181 Stopped                 sleep 3000# 让 2 号进程重新运行
[root@jock yum.repos.d]# bg %2
[2]+ sleep 3000 &# 再次查看
[root@jock yum.repos.d]# jobs -l
[1]-  9178 Running                 sleep 3000 &
[2]+  9181 Running                 sleep 3000 &

如果希望将后台进程转换为前台进程则需要使用 fg 命令,它的使用格式为:fg %编号

[root@jock yum.repos.d]# jobs -l
[1]-  9178 Running                 sleep 3000 &
[2]+  9181 Running                 sleep 3000 &# 将编号为2的后台进程转换为前台进程
[root@jock yum.repos.d]# fg %2
sleep 3000

如果希望终止后台进程,则通过 kill %编号 格式来实现:

[root@jock ~]# jobs -l
[1]+  9138 Running                 sleep 3000 &[root@jock ~]# kill %1[root@jock ~]# jobs -l
[1]+  9138 Terminated              sleep 3000
  • 把一个进程从前台转到后台

使用 ctrl+z 可以将一个正在前台执行的进程挂起,并把它转到后台

运行 bg 命令,将任务从前台转到后台,将一个被挂起的进程转到后台并继续执行

运行 fg 命令,将任务从后台转到前台

当启动一个进程时,在命令行的最后加上 & 符号,便可以使进程在后台运行

前台:短时任务,任务运行结束后用户会再次回到命令行; (前台进程是与用户直接交互的进程)

在任何时刻,只有一个进程组可以在前台运行。这个进程组可以从终端接收输入,向终端发送输出。如果一个前台进程正在运行,终端会被阻塞,即用户无法在终端进行其他操作,直到这个前台进程完成。

后台:长时任务,当用户退出命令行时并不影响任务运行

http://www.dtcms.com/a/431422.html

相关文章:

  • [创业之路-645]:手机属于通信?还是属于消费类电子?还是移动互联网?
  • 网站建设 交易保障公众号推广一个6元
  • Nodejs--如何获取前端请求
  • 【项目】基于Spring全家桶的论坛系统 【下】
  • 红黑树可视化工具
  • 深圳公司网站建设设徐州关键词优化排名
  • 三角函数速度规划方法介绍
  • 安卓基础组件020-页面跳转传递复杂数据002
  • Linux操作系统-进程(二)
  • 网站建设的工作计划有什么好字体可以导入wordpress
  • 贵州网站公司厦门seo排名
  • 湖南省建设银行网站6装饰设计网站模板
  • 求余运算和数学模运算的知识了解
  • 【LeetCode】26、80、169、189、121、122、55、45、274题解
  • 【Python刷力扣hot100】1. Two Sum
  • 网站建设属于什么行业类别wordpress数据库文件在哪里设置
  • CCF-CSP认证考试 202309-3 梯度求解
  • JavaScript 保留关键字详解
  • 赣州那里有做网站的公司中国最新军事新闻最新消息2023
  • 使用 Python 将文件上传到 Supabase Storage 并记录元数据
  • 测试报告——“问卷考试系统”项目
  • 网站开发者常见问题网站建设 010
  • Digi-Star精准饲喂系统:牧场收益提升的利器,把Digi XBee模块应用到了极致
  • LED点阵屏
  • 图片方向矫正工具,批量处理超高效
  • 网站开发系统源代码模板兔自用主题WordPress
  • 鄢陵县网站wordpress编辑器器更换
  • 安阳网站推广优化点击最多的网站
  • 护理+人工智能研究热点数据分析项目实战(五)
  • 重庆市建设工程质量协会网站在招聘网站做销售