Linux系统的systemd与gawk的使用

1、简述systemd的新特性及unit常见类型分析,能够实现编译安装的如nginx\apache实现通过systemd来管理

针对CentOS7系列的systemd是一种init软件,用于管理服务与程序;CentOS5有SysV,而6有Upstart;其7和5、6的init软件完全不同,正因如此,由于systemd的新特性,CentOS7在开机启动的速度上表现良好。其新特性大概有以下几点:

1.系统引导时,实现服务并行启动,大大缩短了系统的启动时间;

2.用户可按需激活所需要启动的进程,也可查看或者停止此进程;

3.具有系统状态快照功能;

4.基于依赖关系定义服务的控制逻辑。

5.其核心概念是unit,unit由其相关的配置文件进行标识和识别,文件中主要包含了系统服务、监听的socket、保存的快照以及其他与init相关的信息,这些配置文件主要保存在:/usr/lib/systemd/system/,/run/systemd/system/,/etc/systemd/system/。

6.unti有些常见的类型,以服务名.unit(这里的unit表示各种类型)结尾,分别表示不同的意义:

用于定义系统服务的,表示为*.service;

用于定义模拟实现“运行级别”的,表示为*.target;

用于定义内核识别设备的,表示为*.device;

用于定义文件系统挂载点的,表示为*.mount;

用于标识进程间通信用到的socket文件的,表示为*.socket;

用于管理系统快照的,表示为*.snapshot;

用于标识swap设备的,表示为*.swap;

用于定义文件系统自动挂载的,表示为*.automount;

用于定义文件系统中的文件或目录的,表示为*.path;

7.系统服务有unit file来定义,systemd管理系统服务就基于此文件,例如:systemctl start httpd.service等;

其unti file文件通常由三部分组成:

[unit]:定义与Unit类型无关的通用选项,用于提供Unit的描述信息、unit行为及依赖关系等;其常用选项有:

    Description:意义性描述,unit的描述信息;

    After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反;

    Requies:依赖到的其他的units,表示强依赖,如果被依赖的units无法激活时,当前unit即无法激活;

    Wants:依赖到的其他的units,表示弱依赖,如果被依赖的units无法激活时,不影响当前unit的激活状态;

    Conflicts:定义units之间的冲突关系;

[Unit-TYPE][service]:定义与特性类型相关的专用选项,指明unit类型,这里是service的类型,也可指明target,monut等;其针对service也有常用的选项:

    Type:用于定义影响Execstart及相关参数功能的unit进程启动类型;

    Execstart:指明启动unit要运行的命令或脚本,ExecstartPre(启动之前的脚本),ExecstartPost(启动之后的脚本);

    Execstop:指明停止unit要运行的脚本或命令;

    EnvironmentFile:环境配置文件;

    Restart:顾名思义,unit要重启时运行的脚本或命令;

[Install]:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启动或禁用时用到的一些选项;也有些常用选项:

    Alias:定义别名;RequiredBy:被哪些unit所依赖;WantedBy;

特别提醒:对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件,否则不会生效,使用systemctl daemon-reload命令重载。

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true

[Install]
WantedBy=multi-user.target

安装nginx或apache,用别人编译好的rpm包安装能安装自己有些不想用的功能,用yum能自动解决依赖关系,如果想纯净版(我自己起的名字)安装nginx和apache,就得用编译安装了,但编译安装根据各种程序的版本不一样和所依赖的平台不一样,所需要解决的依赖关系也不一样,本人亲测过,很麻烦,用了一天的时候解决;但是编译安装之后,用systemd服务是没办法管理服务的,也就是说不能用systemctl start|stop 服务名 来启动或停止服务的,需要配置untifile文件,编译安装是自动不会生成的。

对于我这个零基础的人来说,用了一天的时间来了解怎么编译安装,大概了解了些,也与大家分享:

我的平台是CentOS 7 x86_64的,这里以apache的httpd2.4为例,跟大家分享下怎么安装,Linux系统是最小化安装哦。

1.首先下载httpd2.4的源码包,这里去apache的官网上找,都能找到,纵然全是英文,聪明如你,肯定能找到,当然还有编译安装所依赖的环境包。

2.查看自己系统上是否安装了开发包组,叫开发工具,CentOS6上是两个组件,依据你编译时的提示信息安装,想省事yum也可以。Development Tools,Server Platform Development,这两个包组,7上只安装前者即可。

[root@yuanchao ~]# yum grouplist
...
Available Environment Groups:
   Minimal Install
...
Available Groups:
...
   Development Tools
...
Done
[root@yuanchao ~]# 

3.这里我之前编译过2.4,所以大概知道所需要的依赖包,先给大家列出来,都是在官网上找的源码包。

[root@yuanchao ~]# ls
anaconda-ks.cfg   apr-iconv-1.2.2.tar.gz  boot.iso  httpd-2.4.34.tar.gz  pcre-8.42.tar.gz  test
apr-1.6.3.tar.gz  apr-util-1.6.1.tar.gz   fstab     myboot               script
[root@yuanchao ~]# 

这里面需要的依赖包,我这里是源代码包,如果不想麻烦的编译安装,有些直接yum依赖包也可以,这里还有个依赖包,我没列出来是expat-devel,亲测我yum之后,不能使用,可能因为版本问题,所以我都是编译安装依赖包的。

[root@yuanchao httpd-2.4.34]# 
[root@yuanchao httpd-2.4.34]# ls
ABOUT_APACHE     ap.d          CHANGES         docs         httpd.spec      libhttpd.dep  Makefile.win   README            srclib
acinclude.m4     build         CMakeLists.txt  emacs-style  include         libhttpd.dsp  modules        README.cmake      support
Apache-apr2.dsw  BuildAll.dsp  config.layout   httpd.dep    INSTALL         libhttpd.mak  NOTICE         README.platforms  test
Apache.dsw       BuildBin.dsp  configure       httpd.dsp    InstallBin.dsp  LICENSE       NWGNUmakefile  ROADMAP           VERSIONING
apache_probes.d  buildconf     configure.in    httpd.mak    LAYOUT          Makefile.in   os             server
[root@yuanchao httpd-2.4.34]# ./configure --prefix=/opt/apache --sysconfdir=/etc/httpd
checking for chosen layout... Apache
checking for working mkdir -p... yes
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking target system type... x86_64-pc-linux-gnu
configure: 
configure: Configuring Apache Portable Runtime library...
configure: 
checking for APR... no
configure: error: APR not found.  Please read the documentation.
[root@yuanchao httpd-2.4.34]# 

这里看到APR没有,所有去安装apr,想省事情可以直接yum哦。

configure: 
checking for APR-util... no
configure: error: APR-util not found.  Please read the documentation.
[root@yuanchao httpd-2.4.34]# 

我这里就不演示yum或者configure的过程了,只给大家说下出现的报错信息怎么解决,当然也都是在网上找的答案。

上面的图是,我已经安装过apr-1.6.3这个包了,然后又回到httpd的里面重新 ./configure --prefix=/opt/apache --sysconfdir=/etc/httpd,出现的报错信息,是少apr-util这个包,继续进apr-util这个包里,进行安装。然后再回来继续到httpd这个包里configure,以后所有的报错信息处理完毕后,都回到httpd里继续configure,直到没有报错。

Applying apr-util hints file rules for x86_64-pc-linux-gnu
checking for APR... no
configure: error: APR could not be located. Please use the --with-apr option.
[root@yuanchao apr-util-1.6.1]# 

这里是编译安装apr-util的时候报错,我是直接configure,然后还需要--with-apr=指明你刚才安装apr-1.6.3的路径。

xml/apr_xml.c:35:19: fatal error: expat.h: No such file or directory
 #include <expat.h>
                   ^
compilation terminated.
make[1]: *** [xml/apr_xml.lo] Error 1
make[1]: Leaving directory `/root/package/apr-util-1.6.1'
make: *** [all-recursive] Error 1
[root@yuanchao apr-util-1.6.1]# 

这里是编译安装apr-util执行到make时候的报错信息,解决方法是yum install expat-devel这个包,我这里就不编译安装expat-devel这包了,主要是赖得去找这个源码包了,呵呵。

checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/
[root@yuanchao httpd-2.4.34]# 

以上的依赖包都安装完后,继续进httpd的包里configure,报错依旧,是少pcre这个依赖包,继续解决依赖,进pcre里编译安装。

我这里解决完以前问题,就没有报错,直接install完成了,把apache安装在了/opt/apache目录下。

[root@yuanchao ~]# cd /opt/
[root@yuanchao opt]# ls
apache
[root@yuanchao opt]# cd apache/
[root@yuanchao apache]# ls
bin  build  cgi-bin  error  htdocs  icons  include  logs  man  manual  modules
[root@yuanchao apache]# 
[root@yuanchao apache]# cd htdocs/
[root@yuanchao htdocs]# ls
index.html
[root@yuanchao htdocs]# cat index.html 
<html><body><h1>It works!</h1></body></html>
[root@yuanchao htdocs]# cd ..
[root@yuanchao apache]# ls
bin  build  cgi-bin  error  htdocs  icons  include  logs  man  manual  modules
[root@yuanchao apache]# cd bin/
[root@yuanchao bin]# ls
ab         apxs      dbmmanage  envvars-std  htcacheclean  htdigest  httpd      logresolve
apachectl  checkgid  envvars    fcgistarter  htdbm         htpasswd  httxt2dbm  rotatelogs
[root@yuanchao bin]# 

这里其实我在测试过程中还遇到了一个问题,如下图所示。但这次安装没有遇到,不清楚是什么原因。

不过这个问题,我在网上也找到了答案,可以参考下,非常感谢这位大神的博客,可能是我自己安装的路径有问题。

http://blog.51cto.com/13564078/2105494

那么,编译安装完成,之后的,导入环境变量,导出配置文件,导出头文件,帮助文件,也是需要做的。

这里需要注意的是,--prefix,--sysconfdir如果需要指定不是默认路径,那么安装的目录需要事先创建,然后再指明路径,测试了好几次,发现make install后指明的路径下没有目录和文件,不清楚是什么情况,有大神明白的可以指点下。

[root@yuanchao ~]# vim /etc/profile.d/httpd.sh^C
[root@yuanchao ~]# cat /etc/profile.d/httpd.sh
export PATH=/opt/apache/bin:$PATH
[root@yuanchao ~]# 
[root@yuanchao ~]# 
[root@yuanchao ~]# /opt/apache/bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::ad19:1d60:686:b40b. Set the 'ServerName' directive globally to suppress this message
[root@yuanchao ~]# 
[root@yuanchao ~]# ss -tnl
State      Recv-Q Send-Q   Local Address:Port                  Peer Address:Port              
LISTEN     0      128                  *:22                               *:*                  
LISTEN     0      100          127.0.0.1:25                               *:*                  
LISTEN     0      128          127.0.0.1:6010                             *:*                  
LISTEN     0      128          127.0.0.1:6011                             *:*                  
LISTEN     0      128                 :::80                              :::*                  
LISTEN     0      128                 :::22                              :::*                  
LISTEN     0      100                ::1:25                              :::*                  
LISTEN     0      128                ::1:6010                            :::*                  
LISTEN     0      128                ::1:6011                            :::*                  
[root@yuanchao ~]# 

这里启动服务了,但是没有untifile文件。

[root@yuanchao ~]# curl http://10.9.3.72
<html><body><h1>It works!</h1></body></html>
[root@yuanchao ~]# 

显示是能启动服务的。

编辑/usr/lib/systemd/system/httpd.service文件,创建个unitfile,然后在/etc/systemd/system/创建个链接文件指向前者。

[root@yuanchao ~]# vim /usr/lib/systemd/system/httpd.service
[root@yuanchao system]# ln -sv /usr/lib/systemd/system/httpd.service ./httpd.service
‘./httpd.service’ -> ‘/usr/lib/systemd/system/httpd.service’
[root@yuanchao system]# 

我的apache是安装在自己的目录下/opt/apache,配置文件在/etc/httpd2/目录下。下面是untifile文件。

[Unit]
Description=apache

[Service]
Type=simple
EnvironmentFile=/etc/httpd2/httpd.conf
ExecStart=/opt/apache/bin/httpd -k start -DFOREGROUND
ExecStop=/opt/apache/bin/httpd -k stop
ExecReload=/opt/apache/bin/httpd -k reload graceful
ExecRestart=/opt/apache/bin/httpd -k restart

[Install]
WantedBy=multi-user.target

[root@yuanchao ~]# systemctl daemon-reload

创建完之后记得要重载systemd配置文件。

然后就可以愉快的systemd管理服务了。这里需要说明的是,Stop选项官方的配置文件是加的变量,这里我还没搞明白Kill的用法和${MAINPID}这个变量的指向。测试过了,也能停止服务,但是就是Stop的时候有报错,没有信息返回,大家可是尝试下。

2、描述awk命令用法及示例(至少3例)

awk是Linux系统文本处理三剑客其中之一,与sed,grep都是文件处理工具,因为awk是在Unix系统上的,后来Linux发行版加入了GUNawk,简称gawk,完全兼容awk的用法。

其基本用法:awk [option] 'program' FILE...

其中program可以分为PATTERN{ACTION STATEMENTS}前面是条件匹配,可匹配要处理的内容为什么内容,中括号中的是处理动作,打印情况等,其中有print和printf两种,所以你可以理解为awk是一个非常强大的文本报告器,格式化文本内容,但对原文件没有影响,查看数据,过滤数据,形成报表,非常high!

选项:-F:指明输入时用到的字段分隔符;

-v 可以在输入命令时,指定变量,因为awk有内置的变量,格式如:var=VALUE等

awk有几个基础点,了解和掌握,对于文本处理就可以游刃有余:

1.print:打印显示条目,后面可跟item,用逗号隔开,条目可以是字符串,也可以是数值,如果省略,则表示打印匹配的整行;

2.内建变量:(awk中引用变量是不需要加$的)

FS:输入的变量,默认是空白字符;OFS:输出的变量;RS:输入时的换行符;ORS:输出时的换行符;

NF:字段的数量;NR:行数;FNR:文件中的行数,各文件分别计数,后面的参数是多个文件;

FILENAME:当前正在处理的文件名;ARGC:命令行参数的个数;内建的数组;ARGV:数组,保存的是命令行所给定的各参数;

例如:awk -v FS=':' -v OFS='#' '{ print $1,$3,$7 }' /etc/passwd passwd文件里都是以:分隔的,输出显示以#为分隔符,显示第1,3,7字段,用户名,UID,和默认shell;

awk -F ':' '{print $1,$3}' /etc/passwd 以:为分隔符显示第1,3字段;

默认awk的输入输出分隔符都为空白字符,-F指定输入分隔符,也可以-v指定内建变量的值来区分输入输出的分隔符;

[root@yuanchao ~]# awk -F':' '{print $1,$3}' /etc/passwd
root 0
bin 1
...
[root@yuanchao ~]# awk -v FS=':' -v OFS='#' '{print $1,$3,$7}' /etc/passwd
root#0#/bin/bash
bin#1#/sbin/nologin
...

3.printf命令,与print功效一样,但用法有差别;需要在printf后面加FOEMAT(格式)item(条目);

其实格式必须给出,输出不会自动换行,如需要得加\n,格式中需要分别为后面的每个条目指定一个格式化符号;

格式化符号有:

%c:显示字符的ASCII码; %d(%i):显示十进制整数; %e(%E):显示为科学计数法数值; %f:显示为浮点数形式; %g(%G):以科学计数法或浮点型显示数值; %s:显示字符串; %u:显示无符号整数; %%:显示%符号本身;

格式化符号后可加修饰符一般有数字#表示显示的字节最大多少,-(显示对齐方式,-表示左对齐,默认是右对齐),+(显示数值的符号,针对的是有些数值是负数)等;例如:%3.1f,3表示显示的字节为3个,1表示保留小数点后1位的精度;

4.操作符:awk支持在program中添加操作符以表示逻辑关系,算术操作符,加减乘除次方取模等,等于大小于,与或非等;

还支持函数调用(funcation_name(arge1,arge2,...))和条件表达式(selector?if-ture-expression:if-false-expression);

支持if语句,?前面是条件规则,真假条件的表达式中间用:隔开,与print之间用;隔开;例如:

awk -F: '{$3>=500?user="common user":user="sysadmin";printf "%15s:%-s\n",$1,user}' /etc/passwd

$3是文本里的第3个字段是UID大于等于500,user这个变量,前面条件为真也就是UID大于或等于500表示普通用户,如果为假,也就是UID小于500表示系统用户,然后打印显示,以:为分隔符,左侧的显示字符串形式最大15个字节,默认右对齐,:右侧的显示字符串形式,左对齐,要换行,然后打印第一个字段和user这个变量的值,在passwd文件里查询显示;

[root@yuanchao ~]# awk -F: '{$3>=500?user="common user":user="sysadmin"; printf "%15s:%-s\n",$1,user}' /etc/passwd
           root:sysadmin
...
           sshd:sysadmin
...
        tcpdump:sysadmin
            tom:common user
[root@yuanchao ~]# 

这里测试过了,printf后面跟的格式和要显示的条目之间也需要加逗号,否则会报错;

5.PATTERN:条件表达式,在{}之外表示;

a. 其中也有很多种表示,如果什么都不加,表示空模式,匹配文本每一行;

b. 可以用正则表达式,/PATTERN/,仅处理能够被正则表达式匹配到的行;

c. 也可跟条件表达式,关系表达式,结果有真有假,结果为真时才会被处理;真表示:结果为非0值,非空字符串;

d. 可表示行范围,例如/pat1/,/pat2/;注意:不支持直接给出数字的格式,需要模式指出,可以变量比较;

e. BEGIN/END模式:BEGIN表示仅在开始处理文件中文件之前执行一次;END表示文本处理完成之后执行一次;

f. 常用的action:awk语句,if,while语句,组合语句,输入输出等;

g. 控制语句,if(condition) {statements},if(condition) {statements} else {statements},for,while,break,continue,next,数组等;

h. 数组:可以指定关联数组,数字里的元素可以用任意字符串,字符串要用引号;

    如果某数组元素事先不存在,则在引用时,awk会自动创建此元素,并将其值初始化为“空串”;若要判断数组中是否存在某个元素,要使用“index in array”格式进行;若要变量数组中的每个元素,则可使用for循环;

awk 'BEGIN{weekday["mon"]="Monday";weekday["tue"]="Tuesday";weekday["wen"]="Wensday";for(i in weekday)print weekday[i]}'

这表示定义一个数组,里面有3个元素,循环打印里面的元素各一次;

[root@yuanchao ~]# awk 'BEGIN{weekday["mon"]="Monday";weekday["tue"]="Tuesd";weekday["wen"]="Wensday";for(i in weekday)print weekday[i]}'
Wensday
Tuesd
Monday
[root@yuanchao ~]# 

netstat -tnl | awk '/^tcp\>/{state[$NF]++}END{for(i in state)print i,state[i]}'

netstat显示网络连接状态,显示以TCP开头的连接状态的连接次数,用于统计;

[root@yuanchao ~]# netstat -tnla | awk '/^tcp\>/{state[$NF]++}END{for(i in state)print i,state[i]}'
LISTEN 3
ESTABLISHED 1
[root@yuanchao ~]# 

awk '/^UUID\>/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab

显示fstab文件中每个文件系统类型出现的次数,UUID开头的行的第三个字段表示挂载的文件系统类型;

[root@yuanchao ~]# awk '/^UUID\>/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab 
xfs 1
[root@yuanchao ~]# 

awk '{for(i=1;i<=NF;i++)count[$i]++}END{for(i in count) print i,count[i]}' /etc/fstab

这个命令就是锻炼循环和变量的使用,第一个for循环使用的是特殊用法,统计出现多少单词,定义在count这个数组里,NF自建变量表示字段数,后一个for循环是引用count这个数组里的元素来循环统计一次,循环一次执行一次文本,故用END模式;这个命令表示统计fstab文件中每个单词出现的个数;

[root@yuanchao ~]# awk '{for(i=1;i<=NF;i++)count[$i]++}END{for(i in count)print i,count[i]}' /etc/fstab 
swap 2
fstab(5), 1
filesystems, 1
...

3、描述awk函数示例(至少3例)

awk里面还可以调用函数,分有内置函数和自定义函数;

内置函数有数值处理和字符串处理两种:

数值处理:rand():返回0和1之间的一个随机数;

字符串处理:length():返回字符串的长度;

sub(r,s,[t]):以r表示模式来查找t所表示的字符串中的匹配内容,并将其第一次出现替换为s所表示的内容;

gsub(r,s,[t]):以r表示模式来查找t所表示的字符串中的匹配内容,并将其所有出现均替换为s所表示的内容;

split(s,a[r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;

netstat -tanl | awk '/tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count)print i,count[i]}'

[root@yuanchao ~]# netstat -tanl | awk '/tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count)print i,count[i]}'
0.0.0.0 3
10.9.3.185 1
[root@yuanchao ~]# 

ip这个数组中的第2个元素的值为count这个数组的下标元素,循环执行看IP的连接次数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值