慢慢来,是种诚意,加载中 . . .

linux学习宝典二


linux学习宝典二

linux文件压缩与解压

压缩工具的介绍

说到文件管理,就不得不说到tar,因为tar可以压缩和解压缩linux文件,所以要先了解一下压缩和解压缩。

由于以前的计算机磁盘容量比较小,业内人士绞尽脑汁,终于开发出了一个能帮助用户节省磁盘的工具,就是压缩工具,我们知道计算机在存储数据的时候都是使用bytes来计算的,但是实际上1byte=8bits,在日常使用中并不是所有的数据都能把这个1byte用完,有的可能用了三个bits,有的可能用了四个bits,而他们的实际占用空间是2bytes=16bits,剩余的空间就浪费了,压缩工具就是通过算法,将占用三个bits的数据和占用四个bits的数据放在一个byte里,这样我们就能节省出来1byte,这种空间的节省,当你在压缩一个包含了很多文本文件的目录时是非常明显的。其实就像没有人知道早高峰的公交车里有多少人一样,一个人理论上占用的公交车内的空间,跟实际占用的空间,往往有很大差别,因为挤挤总能上去的。

压缩工具诞生的初衷和原理我们说完了,那现在它就没用了么?依然有用,只不过现在我们使用压缩工具的目的,更多的是便于存储和传输,在linux系统中压缩工具有很多,不同的工具压缩后的后缀名和大小都有差异,从远古时代说起,linux都出现了以下这些格式的压缩文件

*.Z 使用compress压缩的文件

*.zip 使用zip压缩的文件

*.gz 使用gzip压缩

*.bz2 使用bzip2压缩

*.xz 使用xz压缩

*.tar 使用tar工具打包,没有压缩

*.tar.gz 使用tar工具打包,经过gzip压缩

*.tar.bz2 使用tar工具打包,经过bzip2压缩

*.tar.xz 使用tar工具打包,经过xz压缩

其中,compress已经过时了,因为太老,个别版本的linux已经不支持了,linux下的压缩工具还是以gzip和bzip2以及后加入的xz作为主力,但是由于这些工具,最早不能压缩目录,只能针对单一文件进行压缩,所以在日常使用中,他们都是配合着tar这个打包工具,由tar把目录中的很多文件打包成一个文件,再经由对应的工具进行压缩,所以我们会看上面的那些tar.*的压缩包。好了我们先来学习下这些压缩工具如何使用

压缩文件的好处有如下几点:

- 文件更小,便于网络传输,效率高;
- 避免杂乱,可以减少文件个数,多个文件一起压缩;
- 有些文件不能直接传输,比如安装程序,压缩后就可以传输了

压缩工具的使用

  • gzip
[root@zutuanxue ~]# gzip -h
Usage: gzip [OPTION]... [FILE]...
  -c	保留源文件	
  -d	解压缩
  -h	显示帮助
  -t	检查压缩文件的数据一致性,用来确定压缩文件是否有错误
  -v	显示压缩包的相关信息,包括压缩比等
  -V	显示版本号
  -1	压缩最快,压缩比低
  -9	压缩最慢,压缩比高
  • bzip2
[root@zutuanxue test]# bzip2 -h
   -h		帮助
   -d		解压
   -z 		压缩 默认值
   -k		保留源文件
   -v		查看版本信息
   -1 ..-9   同gzip相同
   bzip2的使用与gzip相同,两种工具的区别就是压缩算法不同,bzip2的压缩比更好一些,bzip的包查看的时候使用的是bzcat,bzmore,bzless,bzgrep同gzip用法相同
[root@zutuanxue test]# gzip -c services > services.gz
[root@zutuanxue test]# bzip2 -k services
  • xz
    虽然bzip2的压缩效果相对比gzip已经提升很多,但是技术是永无止境的,于是出现了xz,它的用法跟gzip和bzip2一样
[root@zutuanxue test]# xz -h
  -d				解压缩
  -t				检查压缩文件的完整性
  -l				查看压缩文件的相关信息
  -k				保留源文件
  -c				将信息输出到显示器上
  -0 ... -9			指定压缩级别
  -h				显示帮助
[root@zutuanxue test]# xz -k services
  • tar
    前面我们提到了,大多数压缩工具只能针对单一文件进行操作,如果你要压缩目录的话就会很麻烦,这时候我们可以使用tar这个打包工具,将目录内的多个文件打包成一个文件,再进行压缩。
[root@zutuanxue test]# tar --help
用法: tar [选项...] [FILE]...
  -C		解压到指定目录
  -c		建立tar包
  -t		查看tar包内的文件
  -x		解压tar包
  -p		不修改文件属性
  -f		指定文件名称
  -j		使用bzip2算法
  -J		使用xz算法
  -z		使用gzip算法
  -P		允许压缩路径中包含有"/"
  -v		显示详细信息
  -?, --help 查看帮助
  --exclude	压缩过程中排除指定的文件

linux软件包管理

在linux系统中我们经常涉及到软件包的删除和添加,那一起来看下在linux系统中软件包的管理方式都有哪些

  • rpm软件
  • yum软件仓库
  • 源码软件

一、rpm软件包

rpm的介绍

前面的课程我们提到过源码包安装需要解决系统环境、权限等等,这些对于初学者而言都是噩梦一般的存在,所以linux厂商推出了一种类似windows系统中的安装方式,有开发者直接在已知的系统中编译好,使用者可以直接下载并进行安装,升级,卸载等操作。在linux中能够提供这些功能的软件有两种,rpm和dpkg,而在CentOS中使用的是RPM

rpm最早是由redhat开发出来,由于很好用,所以很多发行版也利用rpm来进行软件包的管理。RPM全名RedHat Package Manager,最大的特点就是把需要安装的软件提前编译,打包,然后在rpm包里面存放了用以记录软件依赖关系的相关数据,当用户安装时,优先查看这些数据,如果系统满足数据要求就安装软件包,否则不能安装,安装完成后,将软件包相关信息记录到rpm自己的数据库中,便于查询和卸载等。所以说rpm的优点是方便安装,卸载,查询,缺点就是只能在指定的操作系统上使用,所以不同厂商的rpm包,甚至同一厂商不同版本操作系统的rpm包都不通用。

rpm包的命名

dhcp-server-	4.3.6		-30			.el8		.x86_64		.rpm
软件名称		版本		编译次数	         适用的系统	     适用的平台	   后缀名

软件名	 就是软件包的名称
版本	 每次更新版本号都会改变,用来帮助用户判断软件包新旧的
编译次数	 也是帮助用户判断软件包新旧的
适用的系统 在哪个系统上可以安装,CentOS和rhel的多数软件包都是通用的
适用的平台 指的是硬件平台,比如如果你是32位的CPU就无法安装这个软件包

rpm的使用

rpm包的相关文件一般都会放在对应的目录中,比如rpm包安装后,配置文件会放在/etc下,执行文件会放在/usr/bin下,链接库文件会放在/usr/lib下,帮助与说明文档会放在/usr/share/man和/usr/share/doc目录下

安装

[root@zutuanxue Packages]# rpm -ivh dhcp-server-4.3.6-30.el8.x86_64.rpm 
-i					安装
-v					显示详细信息
-h					显示安装进度
-e					卸载
-U					升级,如果系统中有低版本的就会升级,如果系统没有安装相应的包,则安装
-F					有条件的升级,会检测用户指定的软件包是否已安装到linux中
--nodeps			忽略软件包之间的依赖关系
--replacefiles		覆盖文件
--replacepkgs		修复
--force				强制
--test				测试
-q					查询指定的软件包是否安装
-qi					查看指定的软件包的信息,包括开发商,版本,说明
-ql					查看指定软件包中所包含的文件列表
-qc					查看指定软件包的配置文件
-qa					查看本机安装的所有包
-qf					查看一个文件归属于哪个已安装的软件包

rpm的内容我们就介绍到这里,接下来我们看下一个yum

二、yum软件仓库

yum的介绍

YUM(Yellow dog Updater, Modified)是一个基于rpm却更胜于rpm的管理工具,让你可以更轻松的管理Red Hat Enterprise Linux系统中的软件。你可以使用YUM来安装或卸载软件、也可以利用YUM来更新你的系统,更可以利用YUM来搜索一个尚未安装的软件。不管是安装、更新或者删除,YUM都会自动的帮你解决软件间的依赖性问题。通过YUM会比单纯使用rpm来得更加方便。

YUM包含下列几项组件:

  • YUM下载源:如果把所有RPM文件放在某一个目录中,这个目录就可称为“YUM下载源(YUM Repository)”。你也可以把YUM下载源,通过HTTP、FTP等方式分享给其他计算机使用;当然,你也可以直接使用别人建好的YUM下载源来取得需安装的软件。
  • YUM工具:YUM提供了一个名为yum的命令,你可以使用yum来使用YUM提供的众多功能。
  • YUM插件:YUM还允许第三方厂商(3rd Party)开发YUM的插件(Plug-in),让用户可以任意的扩充YUM的功能,比如说有的插件可以帮助选择最快的yum源
  • YUM缓存:YUM运行时,会从YUM下载源获得软件信息与文件,并且暂存于本机的硬盘上。这个暂存的目录,称为“YUM缓存(YUM cache)”。缓存目录为/var/cache/yum

yum的使用

yum源的配置

由于yum有下载源这个东西,所以我们在使用yum之前需要告诉它去什么地方获取这些软件包,也就是说需要先配置一个yum源

[root@zutuanxue ~]# cd /etc/yum.repos.d/
[root@zutuanxue yum.repos.d]# ls
CentOS-AppStream.repo   CentOS-CR.repo    CentOS-fasttrack.repo   CentOS-Sources.repo
CentOS-Base.repo    CentOS-Debuginfo.repo  CentOS-Media.repo       CentOS-Vault.repo
CentOS-centosplus.repo  CentOS-Extras.repo     CentOS-PowerTools.repo
在CentOS8中yum的下载源配置文件统一都放到/etc/yum.repos.d/目录下,在这个目录中有些默认的下载源
我不使用这些自带的下载源,我想配置一个自己的下载源,让yum使用光盘镜像里的软件包,为了避免干扰,我们把这些自带的下载源都放到一个目录里
[root@zutuanxue yum.repos.d]# mkdir repos
[root@zutuanxue yum.repos.d]# ls
CentOS-AppStream.repo   CentOS-CR.repo         CentOS-fasttrack.repo   CentOS-Sources.repo
CentOS-Base.repo        CentOS-Debuginfo.repo  CentOS-Media.repo       CentOS-Vault.repo
CentOS-centosplus.repo  CentOS-Extras.repo     CentOS-PowerTools.repo  repos
[root@zutuanxue yum.repos.d]# mv *.repo repos
[root@zutuanxue yum.repos.d]# clear
[root@zutuanxue yum.repos.d]# ls
repos
然后使用vim命令建立自己的下载源配置文件
[root@zutuanxue repos]# vim server.repo
[server-BaseOS]			yum源的名称
name=server-BaseOS		完整名称
enabled=1				是否启用
gpgcheck=0				是否检查rpm包的数字签名
baseurl=file:///mnt/BaseOS	下载源地址
[server-AppStream]
name=server-AppStream
enabled=1
gpgcheck=0
baseurl=file:///mnt/AppStream
[root@zutuanxue ~]# mount /dev/cdrom  /mnt/		将光盘挂载到指定位置
由于CentOS8的软件包存放在光盘根目录的BaseOS和AppStream目录中,所以这里面为了保证需要的软件包能正确安装我们配置了两个yum源,这两部分内容你可以放到一个文件里,也可以分别放在两个文件中

以上就是yum源配置文件,我们接下来看下如何建立下载源目录

将下载好的rpm软件包存放到一个指定的目录中[root@zutuanxue ~]# cp /mnt/AppStream/Packages/* myrepo/从光盘镜像中安装createrepo工具[root@zutuanxue ~]# yum install createrepo利用createrepo工具生成软件包之间的依赖关系数据文件[root@zutuanxue ~]# createrepo myself/建立针对此目录的下载源配置文件[root@zutuanxue ~]# vim /etc/yum.repos.d/myrepo.repo[myself]name=packagesenabled=1gpgcheck=0baseurl=file:///root/myself从新的下载源安装软件包[root@zutuanxue ~]# yum install httpd

yum插件安装

[root@zutuanxue ~]# yum install 插件名称插件配置文件存放位置/etc/yum/pluginconf.d/xxx.conf插件的启用和停用修改/etc/yum/pluginconf.d/xxx.conf文件中的enabled字段 1=启用 0=停用[root@zutuanxue ~]# yum [OPTIONS...] COMMAND [ARGVS...]-y							如果遇到问题,代替回答yes--installroot=/path			指定软件包安装的根目录

清除yum缓存

[root@zutuanxue ~]# yum clean all如果有些时候你发现yum运行不太正常,这可能是yum缓存数据错误导致的,所以你需要将yum的缓存清除查看软件包[root@zutuanxue ~]# yum list查看有哪些可用组[root@zutuanxue ~]# yum grouplist     查看dhcp-server这个包的信息   [root@zutuanxue ~]# yum info dhcp-server			搜索dhcp-server这个软件包[root@zutuanxue ~]# yum search dhcp-server		

yum安装

安装dhcp-server软件包[root@zutuanxue ~]# yum install dhcp-server -y		安装一组软件包[root@zutuanxue ~]# yum groupinstall '系统工具' -y	              

卸载软件包

删除一个软件包[root@zutuanxue ~]# yum remove dhcp-server -y			删除一组软件包[root@zutuanxue ~]# yum groupremove '系统工具' -y		

使用epel源

EPEL是一个自由开源的附加软件包仓库,可用于 CentOS 和 RHEL 服务器。顾名思义,EPEL 仓库提供了额外的软件包,这些软件在 CentOS 8 和 RHEL 8 的默认软件包仓库中不可用。

安装epel源

epel地址:https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

[root@zutuanxue ~]# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

三、源码包的安装

在linux系统中,很多新版本的软件包的更新都会优先提供tar包版本的,然后各linux厂商拿到这个tar包之后再给自己的操作系统提供官方的rpm或者dpkg类型的软件包,而这种tar工具打包的软件包我们一般称之为源码包,在这些源码包中一般包含有,程序源代码文件,配置文件(configure),安装使用说明(INSTALL,HOWTO,README)

那这种tar包源码包如何安装呢?简单的流程就是

  • 获取软件包
  • 解压文件
  • 检查当前系统是否满足软件包安装需求
  • 使用gcc进行编译,生成主要的二进制文件
  • 将二进制文件安装到主机

这些步骤看起来很简单,但是在使用过程中有很多问题需要解决,比如说需要解决系统环境,权限问题等等,不同类型的软件在安装方法上会有差异,但是整体步骤就是我们上面所提到的。接下来我们通过一个案例来学习源码安装软件。

案例:源码安装一个nginx软件

获取软件包

软件包获取的方式有很多,最常见的就是拷贝或者下载这两种方式,拷贝咱们就不说了,因为用的太多了;接下来我给大家说一下如何从网络下载软件包。

  • wget命令:文本界面的下载命令
[root@zutuanxue ~]# wget http://nginx.org/download/nginx-1.19.3.tar.gz--2020-10-11 15:59:45--  http://nginx.org/download/nginx-1.19.3.tar.gz正在解析主机 nginx.org (nginx.org)... 3.125.197.172, 52.58.199.22, 2a05:d014:edb:5704::6, ...正在连接 nginx.org (nginx.org)|3.125.197.172|:80... 已连接。已发出 HTTP 请求,正在等待回应... 200 OK长度:1052581 (1.0M) [application/octet-stream]正在保存至: “nginx-1.19.3.tar.gz”nginx-1.19.3.tar.gz 100%[===================>]   1.00M  21.4KB/s  用时 43s     2020-10-11 16:00:28 (24.1 KB/s) - 已保存 “nginx-1.19.3.tar.gz” [1052581/1052581])
  • 解压软件包
[root@zutuanxue ~]# tar xf nginx-1.19.3.tar.gz[root@zutuanxue ~]# ls公共  视频  文档  音乐  anaconda-ks.cfg       nginx-1.19.3模板  图片  下载  桌面  initial-setup-ks.cfg  nginx-1.19.3.tar.gz
  • configure命令:检查当前系统是否满足软件包安装需求,这步的主要目的:
    – 检查环境 是否 满足安装条件 依赖解决
    – 指定安装方式 配置文件 命令文件 各种文件放哪里 开启模块功能【内置模块 三方模块】
    – 指定软件安装在那里
- 安装GCC编译软件 以及nginx依赖,有人问我为啥要安装pcre-devel zlib-devel这两个包,因为你不了解,如果你自己安装过一次就知道在检查当前系统的时候会报错,说没有这两个软件,这里我就直接装上了。大家学习的时候可以试试,是不是我说的这样。[root@zutuanxue ~]# yum -y install gcc pcre-devel zlib-devel- 检查系统是否满足安装需求[root@zutuanxue ~]# cd nginx-1.19.3/[root@zutuanxue nginx-1.19.3]# ./configure --prefix=/usr/local/nginxchecking for OS + Linux 4.18.0-193.el8.x86_64 x86_64checking for C compiler ... found + using GNU C compiler + gcc version: 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) checking for gcc -pipe switch ... foundchecking for -Wl,-E switch ... foundchecking for gcc builtin atomic operations ... foundchecking for C99 variadic macros ... foundchecking for gcc variadic macros ... found.........此处省略10000个字Configuration summary  + using system PCRE library  + OpenSSL library is not used  + using system zlib library  nginx path prefix: "/usr/local/nginx"  nginx binary file: "/usr/local/nginx/sbin/nginx"  nginx modules path: "/usr/local/nginx/modules"  nginx configuration prefix: "/usr/local/nginx/conf"  nginx configuration file: "/usr/local/nginx/conf/nginx.conf"  nginx pid file: "/usr/local/nginx/logs/nginx.pid"  nginx error log file: "/usr/local/nginx/logs/error.log"  nginx http access log file: "/usr/local/nginx/logs/access.log"  nginx http client request body temporary files: "client_body_temp"  nginx http proxy temporary files: "proxy_temp"  nginx http fastcgi temporary files: "fastcgi_temp"  nginx http uwsgi temporary files: "uwsgi_temp"  nginx http scgi temporary files: "scgi_temp"备注:/configure --prefix=/usr/local/nginx--prefix=   指定软件安装到哪个目录
  • make命令:使用gcc进行编译,生成主要的二进制文件
[root@zutuanxue nginx-1.19.3]# make -j4make -f objs/Makefilemake[1]: 进入目录“/root/nginx-1.19.3”cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \	-o objs/src/core/ngx_inet.o \	src/core/ngx_inet.c           ...........省略过程-ldl -lpthread -lcrypt -lpcre -lz \-Wl,-Emake[1]: 离开目录“/root/nginx-1.19.3”备注: make -j4-j 指定几个cpu一起编译    -j4  那就是4个一起干活,默认一个干活,这样速度更快
  • make install 命令将二进制文件安装到主机
[root@zutuanxue nginx-1.19.3]# make installmake -f objs/Makefile installmake[1]: 进入目录“/root/nginx-1.19.3”test -d '/usr/local/nginx' || mkdir -p '/usr/local/nginx'test -d '/usr/local/nginx/sbin' \	|| mkdir -p '/usr/local/nginx/sbin'test ! -f '/usr/local/nginx/sbin/nginx' \	|| mv '/usr/local/nginx/sbin/nginx' \		'/usr/local/nginx/sbin/nginx.old'cp objs/nginx '/usr/local/nginx/sbin/nginx'test -d '/usr/local/nginx/conf' \	|| mkdir -p '/usr/local/nginx/conf'cp conf/koi-win '/usr/local/nginx/conf'cp conf/koi-utf '/usr/local/nginx/conf'cp conf/win-utf '/usr/local/nginx/conf'test -f '/usr/local/nginx/conf/mime.types' \	|| cp conf/mime.types '/usr/local/nginx/conf'cp conf/mime.types '/usr/local/nginx/conf/mime.types.default'test -f '/usr/local/nginx/conf/fastcgi_params' \	|| cp conf/fastcgi_params '/usr/local/nginx/conf'cp conf/fastcgi_params \	'/usr/local/nginx/conf/fastcgi_params.default'test -f '/usr/local/nginx/conf/fastcgi.conf' \	|| cp conf/fastcgi.conf '/usr/local/nginx/conf'cp conf/fastcgi.conf '/usr/local/nginx/conf/fastcgi.conf.default'test -f '/usr/local/nginx/conf/uwsgi_params' \	|| cp conf/uwsgi_params '/usr/local/nginx/conf'cp conf/uwsgi_params \	'/usr/local/nginx/conf/uwsgi_params.default'test -f '/usr/local/nginx/conf/scgi_params' \	|| cp conf/scgi_params '/usr/local/nginx/conf'cp conf/scgi_params \	'/usr/local/nginx/conf/scgi_params.default'test -f '/usr/local/nginx/conf/nginx.conf' \	|| cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf'cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'test -d '/usr/local/nginx/logs' \	|| mkdir -p '/usr/local/nginx/logs'test -d '/usr/local/nginx/logs' \	|| mkdir -p '/usr/local/nginx/logs'test -d '/usr/local/nginx/html' \	|| cp -R html '/usr/local/nginx'test -d '/usr/local/nginx/logs' \	|| mkdir -p '/usr/local/nginx/logs'make[1]: 离开目录“/root/nginx-1.19.3”

到此我们就把nginx安装到/usr/local目录下了,可以使用ls命令看看有没有东西

[root@zutuanxue nginx-1.19.3]# ls /usr/local/nginx/conf  html  logs  sbin
  • 验证安装
    软件已经安装了,我们看看结果吧!
启动软件[root@zutuanxue nginx-1.19.3]# /usr/local/nginx/sbin/nginx

打开虚拟机浏览器输入:http://localhost回车

nginx访问.png

四、CentOS 8 dnf命令

dnf介绍

DNF是新一代的rpm软件包管理器。最早出现在 Fedora 18 这个发行版中,在Fedora 22中正式取代了yum

DNF器克服了YUM的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等多方面的内容。

dnf安装

在CentOS7中需要单独安装

yum install epel-release -y
yum install dnf

在CentOS8中系统默认使用的是DNF,我们所看到的yum只是dnf的一个软连接

[root@zutuanxue ~]# which yum
/usr/bin/yum
[root@zutuanxue ~]# ll /usr/bin/yum 
lrwxrwxrwx. 1 root root 5 5月  14 2019 /usr/bin/yum -> dnf-3

相关目录和使用

  • 目录

/etc/dnf/dnf.conf 配置文件

/etc/dnf/aliases.d/ 为相关命令定义别名的如dnf alias add rm=remove

/etc/dnf/modules.d&/etc/dnf/modules.defaults.d 模块的设置

/etc/dnf/plugins/ 插件的设置

/etc/dnf/protected.d/ 受保护的软件包的设置

/etc/dnf/vars/ 变量设置

  • dnf用法展示
查看DNF的版本
[root@zutuanxue ~]# dnf --version			

查看dnf的可用软件仓库
[root@zutuanxue ~]# dnf repolist		

查看所有软件仓库
[root@zutuanxue ~]# dnf repolist all	

查看已安装的软件包
[root@zutuanxue ~]# dnf list installed	  

查看可安装的软件包
[root@zutuanxue ~]# dnf list available 	

搜索dhcp-server
[root@zutuanxue ~]# dnf search dhcp-server		

查询一个文件是由哪个软件包提供的
[root@zutuanxue ~]# dnf provides /usr/sbin/dhclient

查询软件包详细信息
[root@zutuanxue ~]# dnf info dhcp-server	

安装软件包
[root@zutuanxue ~]# dnf install dhcp-server			

升级软件包
[root@zutuanxue ~]# dnf update systemd	

检查软件包的更新
[root@zutuanxue ~]# dnf check-update	

升级所有可升级的软件包
[root@zutuanxue ~]# dnf update		

升级所有可升级的软件包
[root@zutuanxue ~]# dnf upgrade		

卸载软件包
[root@zutuanxue ~]# dnf remove dhcp-server	
[root@zutuanxue ~]# dnf erase dhcp-server		

删除无用孤立的软件包
[root@zutuanxue ~]# dnf autoremove	

清除缓存中的无用数据
[root@zutuanxue ~]# dnf clean all	

获取某一个命令的帮助
[root@zutuanxue ~]# dnf help clean	

获取dnf命令的帮助
[root@zutuanxue ~]# dnf help			

查看历史命令
[root@zutuanxue ~]# dnf history		

重新执行历史命令中的第19条
[root@zutuanxue ~]# dnf history redo 19	

查看软件包组
[root@zutuanxue ~]# dnf grouplist		

安装一组软件包
[root@zutuanxue ~]# dnf groupinstall '系统工具' 

升级一组软件包
[root@zutuanxue ~]# dnf groupupdate '系统工具'	

删除一组软件包
[root@zutuanxue ~]# dnf groupremove '系统工具'	

从特定的软件仓库安装软件包
[root@zutuanxue ~]# dnf --enablerepo=epel install zabbix

将软件包更新到最新的稳定版
[root@zutuanxue ~]# dnf distro-sync

重新安装指定的软件包
[root@zutuanxue ~]# dnf reinstall dhcp-server

降级软件包
[root@zutuanxue ~]# dnf downgrade dhcp-server

linux服务介绍

什么是服务?在linux系统中,有一些特殊程序,启动后就会持续在后台执行,等待用户或者其他软件调用使用,这种程序我们称为服务。

linux系统中服务的管理工具

  • systemV
  • systemd

一、systemV与init

systemV,systemV当中有一个叫init的程序,这个程序可以让系统中的service命令去调用/etc/init.d/目录下的服务脚本,我们可以通过service命令去控制服务的启动与关闭,或者找到服务相应的执行文件,然后执行,比如/usr/sbin/httpd,这样才能启动一个服务,如果想要停止一个服务则需要使用kill命令去停止
该服务管理方式从RHEL7之前的系统中默认

init的特点

  • 启动/停止/查看
    /etc/init.d/servername start/stop/restart/status
    ​ 或
    ​service servername start/stop/restart/status
  • 开机启动管理与查看
    chkconfig –level 0-6 servername on/off 指定一个服务在哪个运行级别启动
    chkconfig –list servername 查看一个服务在哪些运行级别启动

分类

按照功能分类

  • 系统服务:这些服务的服务对象是linux系统本身,或者linux系统的用户
  • 网络服务:网络服务的服务对象是网络中的其他客户端

按照启动方法分类

  • 独立系统服务:这类服务一经启动,除非系统关闭或者管理者手动结束,否则会一直在后台执行,不管是否用到。由于这类服务一直在后台执行,所以响应速度快,同时也会占用系统资源
  • 临时服务:跟独立的服务不同,临时服务是用到的时候启动,使用完毕后服务会停止,所以临时服务响应速度慢,但是节省系统资源
手动解决服务的依赖关系

服务之间是有依赖关系的,比如说,联网的服务如果想正常运行的话,就必须启动网络服务。而这些服务就需要用户手动去处理

运行级别分类

init会根据用户指定的运行级别,来启动不同的服务,在linux系统中包含了0-6,一共7个运行级别

0 关机

1 单用户

2 无网络的多用户

3 字符模式

4 保留

5 图形模式

6 重启

二、systemd与unit

从CentOS7开始SystemV,也就是init服务,被效率更高的systemd所替代,而这个systemd对应的管理命令就是systemctl,并且systemctl命令也兼容了service(service命令做为systemd的入口,是systemctl命令的封装)。

systemd的优势

  • 并行处理所有服务,缩短开机时间
  • 响应速度快,通过systemctl命令就可以完成所有操作
  • 自动解决服务的依赖关系,类似yum
  • 方便记忆,按照类型对服务进行分类
  • 兼容init

相关文件

/usr/lib/systemd/system/ 服务的启动脚本,包含所有安装完成的服务设置文件

/run/systemd/system/ 系统运行过程中的服务脚本优先级高于上一个文件

/etc/systemd/system/ 管理员手动建立的服务启动脚本,优先级最高

/etc/sysconfig/* 系统功能的默认设置

服务分类

[root@zutuanxue ~]# systemctl -t  help
service				服务单元,用于控制服务
socket				套接字单元,用于进程间通信
target				目标单元,用于控制一组其它单元
device				设备单元,用于控制动态的设备
mount				挂载单元,用于管理文件系统挂载点
automount			自动挂载单元,用于管理文件系统自动挂载点
swap				交换分区单元,用于管理swap设备或swap文件
timer				定时器单元,用于管理基于时间触发的动作
path				路径单元,用于监视文件系统路径,以用于基于路径的启动
slice				范围单元,用于管理与控制一组特定进程的资源占用
scope				范围单元,与service类似,系统自动创建

linux服务管理

systemctl命令

管理服务

我们一起来看一下在服务管理方面systemctl这个工具如何使用

[root@zutuanxue ~]# systemctl start servername
start            	启动服务
stop             	停止服务
restart          	重启服务(没启动的服务会启动)
try-restart		只重启正在运行的服务(没有运行则不启动)
reload          	重载配置文件(修改完服务的配置文件后使用)
status         	 	检查服务状态
is-active        	检查服务是否已经启动
enable          	设置服务开机时启动
disable          	设置服务开机时不启动
is-enabled       	查看服务是否开机自动启动
mask		        屏蔽一个服务
unmask		        取消屏蔽

查看服务

[root@zutuanxue ~]#systemctl command --type=xxx --all
list-units				查看所有加载到内存中的单元				
list-unit-files	查看系统中所有安装的单元文件(存放在/usr/lib/systemd/system)的启用状态
--type=xxx			单元类型
--all						列出系统中所有加载的,不管状态为何
[root@zutuanxue ~]# systemctl 
UNIT	LOAD   ACTIVE SUB       DESCRIPTION                                                      
sys.. loaded active plugged 	/sys.....
sys.. loaded active plugged   /sys.....
sys.. loaded active plugged   /sys.....
sys.. loaded active plugged   /sys.....
sys.. loaded active plugged   /sys.....
sys.. loaded active plugged   /sys.....

UNIT:	单元名称
LOAD:	是否被加载
ACTIVE:	高优先级单元状态,与SUB结合就是使用status查看的状态
SUB:	低优先级单元状态		
DESCRIPTION:简介

服务与端口

我们知道在服务中分为系统服务和网络服务,系统服务是本机使用的,网络服务是给网络中的其它客户端使用的,那其它客户端是如何连接上的网络服务的呢?端口和协议,协议在我们之前的课程中了解过,那端口是什么呢?

端口:设备与外界通讯的出口,分为虚拟端口和物理端口,物理端口又叫接口,比如电脑中可以插网线的RJ45接口等,而虚拟端口指的就是网络服务使用的通讯接口,是不可见的,这些每个虚拟端口都有一个编号,我们称之为端口号,系统当中有一个文件记录的服务和端口号以及协议的对应关系

[root@zutuanxue ~]# cat /etc/services  | more服务名称				端口号/协议				描述			ftp-data        20/tcpftp-data        20/udp# 21 is registered to ftp, but also used by fspftp             21/tcpftp             21/udp          fsp fspdssh             22/tcp                          ssh             22/udp                         telnet          23/tcptelnet          23/udp我们还可以使用netstat工具去查看自己的系统打开了哪些端口[root@zutuanxue ~]# netstat -antulpa			查看所有服务以及对应的端口号n			将输出结果以数字的形式表示,而不是主机名,服务名等t			使用tcp协议u			使用udp协议l			只显示处于监听状态的p			显示程序的名称与进程号c			指定自动更新的间隔时间  秒r			查看路由表信息[root@zutuanxue ~]# netstat -antlup Proto:协议Recv-Q:接收队列,如果接收队列阻塞,可能是受到拒绝服务攻击								Send-Q:发送队列,如果发送队列不能很快清零,可能是有应用向外发送数据包过快,或者对方接收数据包不够快Recv-Q和Send-Q通常应该为0,如果不为0可能意味着有问题,数据包有堆积状态,可以接受短暂的非0状态Local Address:本地的地址和端口号Foreign Address:	外部地址和状态State:						端口状态			 CLOSED 			端口未被使用中。			 LISTEN 			监听中,可以连接			 SYN_SEND   	处在TCP三次握手期间,已经发送SYN包后,等待对方的ACK包。       SYN_RECV   	处在TCP三次握手期间,已经收到SYN包后,进入SYN_RECV状态。       ESTABLISHED	完成TCP三次握手,进入ESTABLISHED状态。可以进行通信。       FIN_WAIT_1   在TCP四次挥手时,主动关闭端发送FIN包后,进入此状态。       FIN_WAIT_2   在TCP四次挥手时,主动关闭端收到ACK包后,进入此状态。       TIME_WAIT    在TCP四次挥手时,主动关闭端发送了ACK包之后,进入此状态,       							等待一段时间,让被动关闭端收到ACK包。       CLOSING      在TCP四次挥手时,主动关闭端发送了FIN包后,没有收到对应的ACK										包,却收到对方的FIN包,此时,进入CLOSING状态。       CLOSE_WAIT   在TCP四次挥手期间,被动关闭端收到FIN包后,进入此状态。       LAST_ACK     在TCP四次挥手时,被动关闭端发送FIN包后,等待对方的ACK包。       UNKNOWN			未知状态PID/Program name: 进程号/程序名称通过netstat命令可以看到自己的linux系统打开了哪些服务及端口号,如果有些端口不想被占用可以关闭相应的网络服务[root@zutuanxue ~]# systemctl list-units --all | grep avahiavahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack                                                                                          avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket                                                                        可以看到这个服务的作用是为内网提供域名解析的[root@zutuanxue ~]# systemctl stop avahi-daemon.service Warning: Stopping avahi-daemon.service, but it can still be activated by:  avahi-daemon.socket[root@zutuanxue ~]# systemctl stop avahi-daemon.socket                   [root@zutuanxue ~]# systemctl disable avahi-daemon.service avahi-daemon.socket Removed /etc/systemd/system/multi-user.target.wants/avahi-daemon.service.Removed /etc/systemd/system/sockets.target.wants/avahi-daemon.socket.Removed /etc/systemd/system/dbus-org.freedesktop.Avahi.service.

服务设置相关文件

我们现在知道了服务的管理是通过systemctl,而它的设置文件存放在/usr/lib/systemd/system/目录下,但是官方不建议我们修改这个目录下的文件,如果需要修改的话,建议我们修改/etc/systemd/system/目录内的相关文件

[root@zutuanxue ~]# yum install dhcp-server[root@zutuanxue ~]# systemctl enable dhcpdCreated symlink /etc/systemd/system/multi-user.target.wants/dhcpd.service → /usr/lib/systemd/system/dhcpd.service.[root@zutuanxue ~]# cd /etc/systemd/system/[root@zutuanxue system]# ls在此目录中包含的文件有三种功能*.service  服务的设置文件*.wants	  此单元可选的依赖,启动指定单元后,建议启动此目录内的单元*.requires			此单元必要的依赖,启动指定单元前,需要启动此目录内的单元服务的设置文件[root@zutuanxue system]# vim /etc/systemd/system/multi-user.target.wants/dhcpd.service [Unit]		对于此单元的简介Description=DHCPv4 Server DaemonDocumentation=man:dhcpd(8) man:dhcpd.conf(5)Wants=network-online.target	After=network-online.targetAfter=time-sync.targetUnit部分会出现的常见内容	Description			简介	Documentation		如何进一步查询相关信息	Wants						与当前单元配合的单元,如果这些单元没有运行,此单元不会启动失败	After						在哪些单元之后启动此单元	Befor						在哪些单元之前启动此单元	Requires				当前单元依赖的单元,如果这些单元没有运行,此单元启动失败	Conflicts				哪些单元与此单元冲突[Service]	这是一个服务还可能是Socket、Timer、Mount等Type=notifyEnvironmentFile=-/etc/sysconfig/dhcpdExecStart=/usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd -group dhcpd --no-pid $DHCPDARGSStandardError=nullService部分会出现的内容	Type			启动时,相关进程的行为			simple		默认值			oneshot		一次性进程,systemd会等待当前服务结束,再继续执行			notify		启动完毕后通知systemd			idle		所有其它任务执行完毕后,此服务才会运行	EnviromentFile	指定环境变量配置文件	Enviroment	指定环境变量	ExecStart	执行什么命令启动当前服务	ExecStartPre	启动当前服务之前执行什么命令	ExecStartPost	启动当前服务之后执行什么命令	ExecStop	执行什么命令停止当前服务	ExecStopPost	停止当前服务后执行什么命令	ExecReload	执行什么命令重新加载服务的配置文件	Restart		服务正常退出、异常退出、被杀死、超时的时候是否重启。常用值			no				不重启			always		无条件重启			on-failure	异常退出时重启	RestartSec	自动重启服务的间隔时间	RemainAfterExit	此服务的进程全部退出之后,是否依然将服务的状态视为active状态	TimeoutSec	定义服务启动或停止的超时时间	KillMode	服务停止时,杀死进程的方法	[Install]	将此单元放到哪一个目标(target)当中WantedBy=multi-user.target	此服务所在的target,当执行systemctl enabled dhcpd时,dhcpd.service的链接会放在/etc/systemd/system/multi-user.target.wants/中Install字段出现的内容WantedBy=multi-user.target	此服务所在的target,当执行systemctl 																			enabled dhcpd时,dhcpd.service的链接会放																	在/etc/systemd/system/multi-user.target.wants/中Also附加单元,当用户使用systemctl enable/disabled时,也自动启用或者停用附加单元Alias		定义别名

服务多实例

[root@zutuanxue yum.repos.d]# dnf install vsftpd -y		安装一个服务
[root@zutuanxue yum.repos.d]# systemctl start vsftpd
[root@zutuanxue yum.repos.d]# netstat -antulp | grep vsftpd
tcp6       0      0 :::21      :::*     LISTEN      6331/vsftpd         
[root@zutuanxue yum.repos.d]# cd /etc/systemd/system/
[root@zutuanxue system]# cp /usr/lib/systemd/system/vsftpd.service ./vsftpd2.service
[root@zutuanxue system]# cd /etc/vsftpd/
[root@zutuanxue vsftpd]# cp vsftpd.conf vsftpd2.conf
[root@zutuanxue vsftpd]# vim vsftpd2.conf 
listen_port=2100

[root@zutuanxuet vsftpd]# vim /etc/systemd/system/vsftpd2.service 
[Unit]
Description=the second Vsftpd ftp daemon			修改简介
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd2.conf		修改配置文件

[Install]
WantedBy=multi-user.target
[root@zutuanxue system]# systemctl list-unit-files  | grep vsftpd
vsftpd.service                              disabled 
vsftpd2.service                             disabled 
vsftpd@zutuanxue.service                    indirect 
vsftpd.target                               disabled 
[root@zutuanxue system]# systemctl start vsftpd
[root@zutuanxue system]# systemctl start vsftpd2
[root@zutuanxue system]# netstat -antulp | grep vsftpd
tcp6       0      0 :::21          :::*        LISTEN      7388/vsftpd         
tcp6       0      0 :::2100        :::*        LISTEN      7392/vsftpd         

linux 进程管理

一、进程介绍

在说进程如何管理之前我们要涉及到进程的一些相关概念

什么是进程?进程(Process)是一个程序在其自身的虚拟地址空间中的一次执行活动。之所以要创建进程,就是为了使多个程序可以并发的执行,从而提高系统的资源利用率和吞吐量。简单来说进程就是一个程序的执行活动。

进程和程序有什么不同?

程序:只是一个静态的指令集合;而进程是一个程序的动态执行过程,它具有生命期,是动态的产生和消亡的。

进程:是资源申请、调度和独立运行的单位,因此,它使用系统中的运行资源;而程序不能申请系统资源、不能被系统调度、也不能作为独立运行的单位,因此,它不占用系统的运行资源。

程序和进程无一一对应的关系。一方面一个程序可以由多个进程所共用,即一个程序在运行过程中可以产生多个进程;另一方面,一个进程在生命期内可以顺序的执行若干个程序。

进程的属性

在Linux系统中总是有很多进程同时在运行,每一个进程都有一个识别号,叫做PID(Process ID),用以区分不同的进程。

除了进程识别号外,每个进程还有另外四个识别号。它们是实际用户识别号(real user ID)、实际组识别号以及有效用户识别号(effect user ID),和有效组识别号(effect group ID)。实际用户识别号和实际组识别号的作用是识别正在运行此进程的用户和组。一个进程的实际用户识别号和实际组识别号就是运行此进程的用户的识别号(UID)和组的识别号(GID)。有效用户识别号和有效组识别号的作用是确定一个进程对其访问的文件的权限和优先权。一般有效用户识别号和有效组识别号和实际用户识别号及实际组识别号相同。除非程序被设置了SUID位或SGID位。

进程间的父子关系

进程之间是有关联性的,有的进程会衍生出额外的进程,这时,这组进程之间就存在了父子关系,衍生出来的进程叫子进程,而原本的进程叫做父进程。

二、linux的工作调度

由于linux是一个多人多任务的操作系统,所以用户在使用linux的时候就会出现有些工作我们需要盯着完成的进度,而有些工作我们直接放在后台执行就可以了,这里面我们就涉及到任务的前后台执行的问题,那么,如何将一个任务放到后台去执行呢?

开启一个在后台执行的工作

[root@zutuanxue ~]# cd /[root@zutuanxue /]# tar -czf /tmp/test.tar.gz etc &	(&表示后台执行)[1] 13568				[1]工作序号;13568进程号(PID)[root@zutuanxue /]# ls tmp/ | grep testtest.tar.gz执行完成后,会在下次敲回车的时候给用户一个反馈[1]+  已完成               tar -czpf /tmp/test.tar.gz etc

将当前的工作调到后台

[root@zutuanxue /]# cd[root@zutuanxue ~]# ls公共  视频  文档  音乐  anaconda-ks.cfg模板  图片  下载  桌面  initial-setup-ks.cfg[root@zutuanxue ~]# vim anaconda-ks.cfg 		按键盘上的ctrl+z是调到后台[1]+  已停止               vim anaconda-ks.cfg		注意由ctrl+z调到后台的工作状态为暂停

那么如何将后台工作的状态更改为运行?如何查看后台有哪些工作呢?

后台工作的查看及状态的更改

[root@zutuanxue ~]# jobs					查看后台工作[1]-  已停止               vim anaconda-ks.cfg[2]+  已停止               find / -print[root@zutuanxue ~]# jobs -l				查看后台工作,并显示进程号[1]- 13663 停止                  vim anaconda-ks.cfg[2]+ 13732 停止                  find / -print[root@zutuanxue ~]# jobs -s				仅查看状态为停止的后台工作[1]-  已停止               vim anaconda-ks.cfg[2]+  已停止               find / -print[root@zutuanxue ~]# jobs -r				仅查看状态为运行的后台工作+:	当使用命令将后台任务调到前台时,默认调用有此标记的任务,也就是最近被调到后台的-:	倒数第二个被调到后台的任务[root@zutuanxue ~]# fg %工作序号(%可省略)	将后台指定的工作调到前台[root@zutuanxue ~]# find / -name \*a\* > /tmp/test.txt^Z		执行一个命令,迅速使用ctrl+z将任务调到后台[2]+  已停止               find / -name \*a\* > /tmp/test.txt[root@zutuanxue ~]# bg %2;jobs 连续执行两条命令,1.使用bg命令将之前的工作状态更改为运行;2.立即使用jobs命令查看状态[2]+ find / -name \*a\* > /tmp/test.txt &[1]+  已停止               vim anaconda-ks.cfg[2]-  运行中               find / -name \*a\* > /tmp/test.txt &注意:更改后台工作状态和查看后台工作状态的命令也可以在终端分别输入,但是如果命令执行的较快的话可能会出现下面的这种情况,也就是状态显示为已完成[root@zutuanxue ~]# find / -name \*a\* > /tmp/test.txt^Z[2]+  已停止               find / -name \*a\* > /tmp/test.txt[root@zutuanxue ~]# jobs[1]-  已停止               vim anaconda-ks.cfg[2]+  已停止               find / -name \*a\* > /tmp/test.txt[root@zutuanxue ~]# bg %2[2]+ find / -name \*a\* > /tmp/test.txt &[root@zutuanxue ~]# jobs[1]+  已停止               vim anaconda-ks.cfg[2]-  已完成               find / -name \*a\* > /tmp/test.txt

管理后台工作

我们可以通过kill命令配合适当的信号来管理后台的工作,信号是进程间通信的最原始机制,不同的信号,有不同的作用,比如说,一个进程接收到了一个让它打开指定文件的信号,那这个进程就去打开这个文件,而不会去考虑原因

[root@zutuanxue ~]# kill %工作序号
		-l				查看
		-1				重新加载,systemctl reload servername
		-2				保存数据并结束	ctrl+c			
		-9				强制结束不管其状态		常用在无法正常终止的程序上
		-15				正常结束(默认值)		systemctl stop servername
[root@zutuanxue ~]# jobs
[1]+  已停止               vim anaconda-ks.cfg
[root@zutuanxue ~]# kill -9 %1
[1]+  已停止               vim anaconda-ks.cfg
[root@zutuanxue ~]# jobs
[1]+  已杀死               vim anaconda-ks.cfg
[root@zutuanxue ~]# jobs

三、进程的查看与管理

在linux中,我们可以通过fg、bg、jobs、kill等来对工作进行管理和调度,这些工作都是我们手动执行的,而那些由系统开启的工作该如何管理呢?管理这些后台工作我们可以使用两种命令ps和top

[root@zutuanxue ~]# ps	  #静态进程管理命令,可以帮助我们查看到ps命令在执行那一刻后台进程的状态
-A			所有进程,等同于-ax
-a			显示所有进程(与终端有关的除外)
-x			与参数a一起使用等同于-A
-u			显示指定用户的进程
-l			长格式
-f			完整输出
-t			从指定终端启动的进程
-C			执行指定命令的进程
[root@zutuanxue ~]# ps aux		#查看系统后台的所有进程USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMANDroot          1  0.0  0.1 252828 11580 ?        Ss   10月23   0:04 /us...root          2  0.0  0.0      0     0 ?        S    10月23   0:00 [kthreadd]root          3  0.0  0.0      0     0 ?        I<   10月23   0:00 [rcu_gp]root          4  0.0  0.0      0     0 ?        I<   10月23   0:00 [rcu_par_gp]root          6  0.0  0.0      0     0 ?        I<   10月23   0:00 [kworker/0:0H-kblockd]root          8  0.0  0.0      0     0 ?        I<   10月23   0:00 [mm_percpu_wq]root          9  0.0  0.0      0     0 ?        S    10月23   0:00 [ksoftirqd/0]USER			开启进程的用户PID				进程的识别号%CPU			进程的cpu占用率%MEM			进程的物理内存占用率VSZ				虚拟内存用量,单位KbytesRSS				物理内存占用量	KbytesTTY				那个终端开启的STAT			进程的状态START			开启时间TIME			CPU占用时间COMMAND			执行具体内容[root@zutuanxue ~]# ps -l		查看当前用户开启的进程F S  UID    PID  PPID  C PRI  NI ADDR SZ WCHAN  	TTY    TIME 	CMD0 S   0   5191   5189  0  80   0 	-  6994 -      pts/1 00:00:02 bash0 R   0  14972   5191  0  80   0 	- 11240 -      pts/1 00:00:00 psF	进程标识	4=权限为root		1=从父进程派生出来但是没有执行	5=1+4		0=没有被设置S	进程状态	R=运行	S=睡眠,可被唤醒	D=睡眠,不可被唤醒(资源不足引起)T=停止				 	 Z=僵尸进程UID	用户识别号PID	进程识别号PPID	父进程号C			cpu使用率 %PRI		内核调度优先级NI		用户设置优先级ADDR	加载到内存的位置,如果是运行的会用-表示SZ		用掉的内存页的大小,1个内存页=4096Bytes 也就是6994x4=27976K内存WCHAN	当前进程在哪个内核函数上睡眠,-表示正在运行,没有睡眠TTY		由哪个终端开启的	pts/n=图形界面或远程		ttyn=字符界面		?=系统进程TIME	用掉的CPU时间CMD		执行的命令

ps只能显示它运行的那一刻的进程的统计信息,如果你想动态的查看就需要使用top

top动态查看

[root@zutuanxue ~]# top-d			指定两次刷新的时间间隔,默认是3秒-p			后面跟进程号,查看指定进程的状态,最多20个PID-n			刷新指定次数后退出-b			批量模式,可以让top将内容输出到指定的位置top的按键?				显示帮助空格&enter			   刷新E				切换统计信息部分,内存显示的单位e				切换任务列表的内存显示的单位l				显示或隐藏摘要信息中的负载统计(第一行内容)t				切换显示或隐藏摘要信息中任务和CPU统计信息(第2,3行内容)m				切换显示或隐藏摘要信息中内存统计(第4,5行内容)u				查看指定用户的进程M				根据内存排序P				根据cpu排序N				根据PID排序R				反向排序F/f			调整任务列表显示的内容,默认只有PID,USER,PR,NI....COMMAND等这些,可				以自定义还需要显示哪些内容,如果显示的列比较多可以使用</>进行左右移动shift+</>按照下一列的内容排序,比如说当前按照PID排序如果按下shift+>,则按照用户名					排序,再次按下就会按照PR排序,一次类推 T				根据cpu使用时间排序k				杀死进程r				修改进程的nice值(优先级)z				将不同的位置标记颜色x				高亮显示排序字段y				高亮显示正在运行的任务b				将高亮显示部分加上背景色Z				自定义颜色L				搜索指定字段,&下一个H				在进程和线程间切换显示和统计方式,默认为进程V				树形显示统计信息J				显示内容左对齐或右对齐c				切换COMMAND列的显示形式,程序名/命令格式i				显示或隐藏空闲进程u/U			查看指定用户的进程d				设置刷新间隔,默认3秒刷新一次W				将当前的设置写入到~/.config/procps/toprc中q				退出top[root@zutuanxue ~]# top -d 11 top - 18:57:05 up 12:56,  3 users,  load average: 0.00, 0.00, 0.002 Tasks: 280 total,   1 running, 279 sleeping,   0 stopped,   0 zombie3 %Cpu(s): 1.5 us,1.5 sy,0.0 ni,97.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st4 MiB Mem : 3918.6 total, 160.1 free, 1264.5 used, 2494.0 buff/cache5 MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2356.6 avail Mem 67PID USER  PR  NI VIRT    RES    SHR  S  %CPU  %MEM   TIME+  COMMAND   1   root  20  0  244408  13740  9100 S  0.0   0.3   0:08.77 systemd 2   root  20  0  0       0      0    S  0.0   0.0   0:00.04 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 cu_par_gp 1-6行显示的内容为1	当前时间为18:57:05;系统一共开机12小时56分;当前有3个用户登录;系统在1,5,15分钟的平均负载,越小表示系统越空闲2	系统中进程的统计信息 总计280个,1个运行,279睡眠,0个停止,0个僵尸3	cpu的负载	按键盘上的“1”可以按照CPU核心数显示			us: 用户空间进程占用CPU时间百分比			sy:	内核进程占用CPU时间百分比			ni:	用户空间内改变过优先级的进程占用CPU时间百分比			id:	空闲CPU时间百分比(100%表示系统完全空闲)			wa: I/O等待占用的CPU时间百分比			hi: 硬件中断占用CPU时间百分比			si:	软件中断占用CPU时间百分比			st:	虚拟化hypervisor从当前虚拟机偷走的时间(如果这个值很高的话,说明你的提					供商的CPU资源有限,而你没能抢过别人,很有可能就是VPS提供商超售了.)4&5	物理内存和虚拟内存相关的统计信息,尤其要注意swap,如果被大量占用,说明你物理内			存不足了6	在top中输入命令时,会显示在这里7	系统进程的信息	PID:	进程ID 	USER  	进程所有者	PR  	进程优先级	NI 	nice值,负数表示高优先级,正数表示低优先级	VIRT    虚拟内存使用量,单位为KB。	RES    进程使用的、未被换出的物理内存大小,单位为KB。	SHR  	进程使用共享内存大小,单位为KB。	S  	进程状态	%CPU  	进程对CPU的使用率。	%MEM   进程对内存的使用率	TIME+  进程使用CPU时间总结,单位秒。	COMMAND	命令		top显示的内容有些看不到怎么办?[root@zutuanxue ~]# top -b -n1 > /tmp/top.txt有些时候想查看的进程资源占用很低,在top中显示的比较靠后,怎么办?[root@zutuanxue ~]# top -d 2 -p 3562Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie%Cpu(s):  2.2 us,  3.9 sy,  0.0 ni, 93.3 id,  0.0 wa,  0.5 hi,  0.1 si,  0.0 stMiB Mem : 3918.6 total, 1495.1 free, 1407.0 used, 1016.5 buff/cacheMiB Swap: 2048.0 total, 2048.0 free, 0.0 used.   2258.4 avail Mem PID USER   PR  NI   VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  3562 root  20   0   49296   6380   4448 S   0.0   0.2   0:00.08 bash

上面所提到的两个查看系统进程的命令,静态的ps和动态的top,他们所显示的内容比较多,有的时候我只想查看一下进程之间的关系,这个时候我可以使用另外的一条命令

[root@zutuanxue ~]# pstree	A				进程之间使用ASCII字符连接	U				进程之间使用UTF-8编码连接	p				显示进程号	u				显示用户[root@zutuanxue ~]# pstree -A | moresystemd-+-ModemManager---2*[{ModemManager}]        |-NetworkManager---2*[{NetworkManager}]        |-VGAuthService        |-accounts-daemon---2*[{accounts-daemon}]        |-alsactl        |-atd        |-auditd-+-sedispatch        |        `-2*[{auditd}][root@zutuanxue ~]# pstree -U | moresystemd─┬─ModemManager───2*[{ModemManager}]        ├─NetworkManager───2*[{NetworkManager}]        ├─VGAuthService        ├─accounts-daemon───2*[{accounts-daemon}]        ├─alsactl        ├─atd        ├─auditd─┬─sedispatch        │        └─2*[{auditd}][root@zutuanxue ~]# pstree -pu | moresystemd(1)-+-ModemManager(916)-+-{ModemManager}(943)           |                   `-{ModemManager}(949)           |-NetworkManager(1040)-+-{NetworkManager}(1050)           |                      `-{NetworkManager}(1053)           |-VGAuthService(902)           |-accounts-daemon(1010)-+-{accounts-daemon}(1013)           |                       `-{accounts-daemon}(1015)           |-alsactl(909)           |-atd(1076)           |-auditd(862)-+-sedispatch(864)           |             |-{auditd}(863)           |             `-{auditd}(865)           |-avahi-daemon(910,avahi)---avahi-daemon(953)

我们现在可以通过三种方法来查看后台的进程,那么后台的进程该如何管理呢?管理后台的进程,除了我们前面提到的kill命令之外还可以使用killall

[root@zutuanxue ~]# kill PID需要注意的是,kill后面如果加的是%num代表杀死后台指定序号的工作,如果不加%代表的是杀死指定进程号的进程,这两个是有区别的[root@zutuanxue ~]# killall	e		精确匹配,最多不能超过15个字符	i		询问用户是否杀死指定名称的进程	I		进程的名称忽略大小写[root@zutuanxue ~]# cat /dev/zero > /dev/null &[1] 102245[root@zutuanxue ~]# ps -lF S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD0 S     0   3562   3559  0  80   0 - 12324 -      pts/1    00:00:00 bash0 R     0 102245   3562 97  80   0 -  1908 -      pts/1    00:00:01 cat0 R     0 102246   3562  0  80   0 - 11240 -      pts/1    00:00:00 ps[root@zutuanxue ~]# killall -ei cat杀死 cat(102870) ? (y/N) y[1]+  已终止               cat /dev/zero > /dev/null

四、进程的优先级

之前我们在查看进程的时候看到两个东西,一个是PRI一个是NI,这两个东西是用来控制进程的优先级,而优先级又决定了CPU先处理谁的数据,后处理谁的数据。一起来看下如何调整进程的优先级

[root@zutuanxue ~]# ps -lF S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY     TIME 		CMD0 S     0   3562   3559  0  80   0 - 12522 -      pts/1  00:00:00 bash0 R     0  85520   3562  0  80   0 - 11240 -      pts/1  00:00:00 ps

linux当中的每一个程序都有一个优先级,也就是PRI,这个数值越小则代表优先级越高,而PRI这个值是由内核控制的,用户无法更改,用户如果想调整程序的优先级就只能调整NI的值,所以linux中优先级的算法就是 新的优先级=旧的优先级+NI的值,比如说我bash那个进程,PRI是80,并且假定内核不会动态调整这个值,如果我将NI值更改为-10的话,那么新的PRI的值就是70,数值变小,意味着这个进程的优先级提高了。但是如果内核在这个过程中动态调整了,最终的值就不确定了。

这个NI的值都可以设置成多少呢?

root用户:-20~19

普通用户:0~19

[root@zutuanxue ~]# nice 	指定新执行的进程的优先级
	-n 	指定优先级
[root@zutuanxue ~]# vim 1&
[1] 108831
[root@zutuanxue ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY    TIME 		CMD
0 S     0   3562   3559  0  80   0 - 12522 -      pts/1  00:00:00 bash
0 T     0 108831   3562  0  80   0 -  9058 -      pts/1  00:00:00 vim
0 R     0 108832   3562  0  80   0 - 11240 -      pts/1  00:00:00 ps

[1]+  已停止               vim 1
[root@zutuanxue ~]# nice -n 10 vim 2&
[2] 109328
[root@zutuanxue ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY    TIME 		CMD
0 S     0   3562   3559  0  80   0 - 12522 -      pts/1  00:00:00 bash
0 T     0 108831   3562  0  80   0 -  9058 -      pts/1  00:00:00 vim
0 T     0 109328   3562  0  90  10 -  9058 -      pts/1  00:00:00 vim
0 R     0 109396   3562  0  80   0 - 11240 -      pts/1  00:00:00 ps

[2]+  已停止               nice -n 10 vim 2
[root@zutuanxue ~]# nice -n -20 vim 3 &
[3] 109470
[root@zutuanxue ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY    TIME 		CMD
0 S     0   3562   3559  0  80   0 - 12522 -      pts/1  00:00:00 bash
0 T     0 108831   3562  0  80   0 -  9058 -      pts/1  00:00:00 vim
0 T     0 109328   3562  0  90  10 -  9058 -      pts/1  00:00:00 vim
4 T     0 109470   3562  0  60 -20 -  9058 -      pts/1  00:00:00 vim
0 R     0 109471   3562  0  80   0 - 11240 -      pts/1  00:00:00 ps

[3]+  已停止               nice -n -20 vim 3

那如何调整一个已经启动的进程的优先级呢?
[root@zutuanxue ~]# vim 1 &
[1] 115098
[root@zutuanxue ~]# vim 2 &
[2] 115099

[1]+  已停止               vim 1
[root@zutuanxue ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0   3562   3559  0  80   0 - 12522 -      pts/1    00:00:00 bash
0 T     0 115098   3562  0  80   0 -  9058 -      pts/1    00:00:00 vim
0 T     0 115099   3562  0  80   0 -  9058 -      pts/1    00:00:00 vim
0 R     0 115100   3562  0  80   0 - 11240 -      pts/1    00:00:00 ps

[2]+  已停止               vim 2
[root@zutuanxue ~]# renice 10 115098
115098 (process ID) 旧优先级为 0,新优先级为 10
[root@zutuanxue ~]# renice -10 115099
115099 (process ID) 旧优先级为 0,新优先级为 -10
[root@zutuanxue ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY    TIME 		CMD
0 S     0   3562   3559  0  80   0 - 12522 -      pts/1  00:00:00 bash
0 T     0 115098   3562  0  90  10 -  9058 -      pts/1  00:00:00 vim
0 T     0 115099   3562  0  70 -10 -  9058 -      pts/1  00:00:00 vim
0 R     0 115736   3562  0  80   0 - 11240 -      pts/1  00:00:00 ps 


评论
  目录