systemd特性及其awk命令的使用

Systemd的新特性:
            系统引导时实现服务并行启动;
            按需激活进程;
            系统状态快照;
            基于依赖关系定义服务控制逻辑;
            
        核心概念:unit
            unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其它与init相关的信息; 这些配置文件主要保存在:
                /usr/lib/systemd/system
                /run/systemd/system
                /etc/systemd/system
            
        unit的常见类型:
            Service unit:文件扩展名为.service,用于定义系统服务;
            Target unit:文件扩展为.target,用于模拟实现“运行级别”;
            Device unit: .device,用于定义内核识别的设备;
            Mount unit: .mount,定义文件系统挂载点;
            Socket unit: .socket,用于标识进程间通信用到的socket文件;
            Snapshot unit: .snapshot, 管理系统快照;
            Swap unit: .swap, 用于标识swap设备;
            Automount unit: .automount,文件系统自动点设备;
            Path unit: .path, 用于定义文件系统中的一文件或目录;
            
        关键特性:
            基于socket的激活机制:socket与程序分离;
            基于bus的激活机制;
            基于device的激活机制;
            基于Path的激活机制;
            系统快照:保存各unit的当前状态信息于持久存储设备中;
            向后兼容sysv init脚本;
                /etc/init.d/
                
        不兼容:
            systemctl的命令是固定不变的;
            非由systemd启动的服务,systemctl无法与之通信;
            
        管理系统服务:
            CentOS 7: service类型的unit文件;
            
                syscemctl命令:
                    - Control the systemd system and service manager
                    
                    systemctl  [OPTIONS...]  COMMAND  [NAME...]
                    
                        启动: service  NAME  start  ==>  systemctl  start  NAME.service
                        停止: service  NAME  stop  ==> systemctl  stop  NAME.service
                        重启: service  NAME  restart  ==>  systemctl  restart  NAME.service
                        状态: service  NAME  status  ==>  systemctl  status  NAME.service
                        条件式重启:service  NAME  condrestart  ==>  systemctl  try-restart  NAME.service
                        重载或重启服务: systemctl  reload-or-restart  NAME.servcie
                        重载或条件式重启服务:systemctl  reload-or-try-restart  NAME.service
                        
                        查看某服务当前激活与否的状态: systemctl  is-active  NAME.service
                        查看所有已激活的服务:systemctl  list-units  --type  service
                        查看所有服务(已激活及未激活): chkconfig --lsit  ==>  systemctl  list-units  -t  service  --all 
                        
                        设置服务开机自启: chkconfig  NAME  on  ==>  systemctl  enable  NAME.service
                        禁止服务开机自启: chkconfig  NAME  off  ==>  systemctl  disable  NAME.service 
                        查看某服务是否能开机自启: chkconfig  --list  NAME  ==>  systemctl  is-enabled  NAME.service
                        
                        禁止某服务设定为开机自启: systemctl  mask  NAME.service
                        取消此禁止: systemctl  unmask  NAME.servcie
                        
                        查看服务的依赖关系:systemctl  list-dependencies  NAME.service
                        
        管理target units:
            
            运行级别:
                0  ==>  runlevel0.target,  poweroff.target
                1  ==>  runlevel1.target,  rescue.target
                2  ==>  runlevel2.tartet,  multi-user.target
                3  ==>  runlevel3.tartet,  multi-user.target
                4  ==>  runlevel4.tartet,  multi-user.target
                5  ==>  runlevel5.target,  graphical.target
                6  ==>  runlevel6.target,  reboot.target
                
            级别切换: init  N  ==>  systemctl  isolate  NAME.target
            
            查看级别: runlevel  ==>  systemctl  list-units  --type  target
            查看所有级别: systemctl  list-units  -t  target  -a
            
            获取默认运行级别:systemctl  get-default  
            修改默认运行级别: systemctl  set-default   NAME.target
            
            切换至紧急救援模式: systemctl  rescue
            切换至emergency模式: systemctl  emergency
            
        其它常用命令:
            关机: systemctl  halt,  systemctl  poweroff
            重启: systemctl  reboot
            挂起: systemctl  suspend
            快照: systemctl  hibernate 
            快照并挂起: systemctl  hybrid-sleep
            
        service unit file:
            文件通常由三部分组成:
                [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等;
                [Service]:与特定类型相关的专用选项;此处为Service类型;
                [Install]:定义由“systemctl  enable”以及"systemctl  disable“命令在实现服务启用或禁用时用到的一些选项;
                
            Unit段的常用选项:
                Description:描述信息; 意义性描述;
                After:定义unit的启动次序;表示当前unit应该晚于哪些unit启动;其功能与Before相反;
                Requies:依赖到的其它units;强依赖,被依赖的units无法激活时,当前unit即无法激活;
                Wants:依赖到的其它units;弱依赖;
                Conflicts:定义units间的冲突关系;
                
            Service段的常用选项:
                Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
                    类型:
                        simple:默认值,执行ExecStart指定的命令,启动主进程
                        forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
                        oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
                        dbus:当前服务通过D-Bus启动
                        notify:当前服务启动完毕,会通知Systemd,再继续往下执行
                        idle:若有其他任务执行完毕,当前服务才会运行
                EnvironmentFile:环境配置文件;
                ExecStart:指明启动unit要运行命令或脚本; ExecStartPre, ExecStartPost
                ExecStop:指明停止unit要运行的命令或脚本;
                Restart:
                
            Install段的常用选项:
                Alias:指当前unit的别名
                RequiredBy:被哪些units所依赖;强依赖
                WantedBy:被哪些units所依赖; 弱依赖

实例:编译安装的nginx并通过systemd来管理
 安装工具
[root@localhost ~]#yum -y install gcc gcc-c++ autoconf automake
[root@localhost ~]#yum -y install zlib zlib-devel openssl openssl-devel pcre-devel
 下载nginx
[root@localhost ~]# cd /usr/local/
[root@localhost local]# wget http://nginx.org/download/nginx-1.13.0.tar.gz 
 解压编译
[root@localhost local]# tar -zxvf nginx-1.13.0.tar.gz
[root@localhost local]# cd  nginx-1.13.0
[root@localhost nginx-1.13.0]# ./configure
安装
[root@localhost nginx-1.13.0]# make && make install
创建nginx.service文件
[root@localhost ~]#vim /usr/lib/systemd/system/nginx.service    
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
检查nginx是否启动
[root@localhost ~]# ps aux | grep nginx

2.描述awk命令用法及示例(至少3例)
awk是一个强大的文本分析工具,相当于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。awk就是把文件逐行读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
使用方法
awk [options] 'scripts' file1,file2, ...
指定选项,指定报告格式化后的脚本,最后指定文件内容的来源;这表示它可以从多个文件中读取文本信息,之后根据所指定的脚本,将其格式化为特定格式,最后显示出来;脚本的格式一般分为两部分组成,如下:
awk [options] 'PATTERN {action}' file1,file2,...
脚本主要由PATTERN和action组成,PATTERN叫模式,这就意味着它并不是对文件中的每一行都进行处理,而仅仅是处理那些能够被模式匹配到的行。行匹配到以后就action,也就是做出相应处理,一般最常见的处理机制是打印出来。常用的打印命令有print和printf可以自定义显示格式,如显示的宽度,显示为字符串还是数值等。
-awk基本处理机制
一次从文件读取一行文本,awk会对其自动进行切片, 将每一行按字符串的分隔符进行切割。如这一行是this is test,它会默认使用空白字符放分隔符,不管空了几格,这样这一行就会分成四片,一片中保存一个单词,而这四片在awk中可以使用一个变量来引用,这个变量相关于脚本中的位置参数;
$1,$2...$0
-测试
[root@localhost ~]# vim awk.txt 
this is a test
[root@localhost ~]# awk '{print $1,$2}' awk.txt
this is
[root@localhost ~]# awk '{print $1}' awk.txt
this
[root@localhost ~]# awk '{print $2}' awk.txt
is
指定分隔符的选项用-F,如-F:,表示以冒号为分隔符。另外还可以指定输出分隔符,如下:
[root@localhost ~]# awk '{OFS=":"}{print $1,$2}' awk.txt
this:is
print的使用格式
print item1,item2,...
如果想在中间插入文本可按下面方法,在要插入的位置使用双引号引起要显示的内容即可:
[root@localhost ~]# awk 'BEGIN {print "line one\nline two\nline three"}'
line one
line two
line three
//打印三行文本,\n表示换行
[root@localhost ~]# awk -F: '{print $1,$2}' /etc/passwd
//以冒号为分隔符,打印passwd的第一段和第二段

awk变量
常用内置变量之记录变量
FS:field separtor,读取文本时,所使用的字段分隔符
RS:Record separator,输入文本信息所使用的换行符
OFS:Output Filed Separator,输出字段分隔符
ORS:Output Row Separator,输出行分隔符
awk内置变量之数据变量
NR:The number of input records,awk命令所记录数。相当于当前的文件,他处理到多少行。如果有多个文件,这个数目会吧处理的多个文件中统一计数。
NF:Number of field,当前记录的field个数,统计正在处理的当前行有多少字段
FNR:与NR不同的是,RNR用于记录正处理的行是当前这一文件中被总共处理的行数
ARGV:数组
ARGC:awk命令参数的个数
FILENAME:awk命令所处理的文件的名称
ENVIRON:当前shell环境变量及其值的关联数组
示列
[root@localhost ~]# awk '{print NF}' awk.txt
4
//显示一共有几个字段
[root@localhost ~]# awk '{print NR}' awk.txt
1
//NR是绝对计数u,显示行号

用户自定义变量
gawk允许用户自定义自己的变量以便在程序代码中使用,变量名命名规则与大多数编程语言相同,只能使用字母、数字和下划线,且不能以数字开头。gawk变量名称区分字符大小写;要定义变量,只要在BEGIN模式中加入变量名等于变量值即可或在命令行中用-v选项定义变量
[root@localhost ~]# awk -v test="hello awk" 'BEGIN{print test}'
hello awk
[root@localhost ~]# awk 'BEGIN{var="variable testing";print var}'
variable testing
//在awk中打印变量值是不用加$$的,加$符是打印字段。后面不带文件,只是做一个简单的演示的时候常用BEGIN。另外,在{}中定义变量时,系统会识别为两个语句,要用分号隔开。

printf命令的使用格式
printf format, item1,item2,...
要点:
a、与print命令的最大不同是,print需要指定format
b、format用户指定后面每个item的输出格式
c、printf语句不会自动打印行符,如果需要换行,要加\n
format格式的指示符都以%开头,后面跟一个字符,如下:
%c:显示字符的ASCII码
%d,%i:十进制整数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%本身
修饰符
N:显示宽度
-:左对齐,不用一时是右对齐
+:显示数值符号
示列:
awk -F: '{printf "%-15s, %-10s\n",$1 $3}' /etc/passwd
//显示$1和$2时,$1左对齐显示15个字符串,没有内容就显示空白,显示$3时用10个字符,换行显示。这里还会显示一个逗号,这里是-15s后面的逗号
awk -F:'{printf "%-5d\n",$3}' /etc/passwd
//以十进制显示每个用户的ID号,做对齐

3.描述awk函数示例(至少3例)
可用函数rand()
示列:
awk 'BEGIN{print rand()}
//使用rand()函数只能随机产生一个数字,这个数字是不会变的
awk 'BEGIN{strand();print rand()}' //配合使用strand()函数,才生成一个大于0小于1的随机数awk 'BEGIN{strand();print int(100*rand())}'
//生成一个小于100的随机整数。使用strand()与rand()乘以100可以得到一个随机的整数随机数,用int是为了截取整数部分,如果没有int,生成的数字会有小数部分。
字符串函数
用gsub或sub函数替换某些文本
[root@localhost ~]# vim test.txt
Allen phillips
Green Lee
William Lee
william ken Allen
[root@localhost ~]# awk '{gsub("l","L",$1);print $0}' test.txt
ALLen phillips
Green Lee
WiLLiam Lee
wiLLiam ken Allen
//用gsub函数将小写l替换成大写L,但是替换范围只限于第一列
[root@localhost ~]# awk '{gsub("[a-z]","6",$1);print $0}' test.txt
A6666 phillips
G6666 Lee
W666666 Lee
6666666 ken Allen
//将第一段中的小写字母替换为6,并显示全部
[root@localhost ~]# awk '{sub("l","L",$1);print $0}' test.txt
ALlen phillips
Green Lee
WiLliam Lee
wiLliam ken Allen
//sub指挥替换指定范围内第一次匹配到的符号条件的字符,也就是第一段的第一个小写l

猜你喜欢

转载自blog.csdn.net/qq_22193519/article/details/83066017