第八周作业

systemd简述,及简易编译安装nginx\apache-httpd管理操作;awk命令的使用方法。

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

systemd是Centos7版本中的init守护进程,unit由其它相关配置文件标识.识别和配置,文件中主要包含系统服务.监听的socket.保存的快照以及其它与init相关的信息.

systemd的新特性:

  • 系统引导时实现服务并行启动.
  • 按需激活进程.
  • 系统状态快照.
  • 基于依赖关系定义服务控制逻辑.

配置文件目录: /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无法与之通信.

配置及三字段的常用选项:

  • ·[Unit]: 定义与Unit类型无关的通用选项。用于体统unit的描述信息,unit行为及依赖关系等。
    • Description:描述信息,意义性描述。
    • After:定义unit的启动次序,表示当前unit应该晚于哪些unti启动,其功能与Before相反
    • Requies:依赖到的其他units,前依赖,被依赖的units无法激活时,当前unit即无法激活。
    • Wants:依赖到其他units,弱依赖,无论依赖的units是否激活,都不影响当前units激活。
    • Conflicts:定义units间冲突关系。
  • ·[Service]:与特特定类型相关的专用选项,此处为Service类型。
    • Type:用于定义影响ExecStart及相关阐述的功能的unit进程启动类型。
      • simple
      • forking
      • oneshot
      • dbus
      • notify
      • idle
    • Enviuronmentfile:环境配置文件
    • ExecStart:指定启动unit要运行命令或脚本, ExesStartPre,ExecStartPost
    • ExecStop:指明停止unit要运行的命令或脚本。
    • Restart
  • ·[Install]: 定义由”systmectl enable”以及”systemctl disable”命令在实现服务启动或禁用时用到的一些选项。
    • Alias:
    • RequiredBy:被哪些units所依赖,强
    • WantedBy:被哪些units所依赖,弱

注意: 对于心差un关键的unti文件或修改了的unit文件,要通知systemd重载此配置文件

重载命令 ~]# systemctl daemon-reload

系统管理服务:

unit的7️个运行级别: 0:runleve10.target,系统为停机状态 1: runleve11.target,单用户工作状态,多用于系统维护 2:runleve12.target,多用户状态,NFS未开启 3:runleve13.target,多用户状态,NFS已开启,进入命令行模式 4:runleve14.target,系统挂起 5:runleve15.target,图形控制模式 * 6:runleve16.target,关闭系统并重新启动

级别切换命令:

~]# init #
或
~]# init systemctl isolate name.target

查看当前级别:

~]# runlevel
或
~]# systemctl list-units --ttype 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

示例:

systmectl 管理 nginx

nginx的准备及编译安装地址: (——————–)

1、编辑配置文件 /usr/lib/systemd/system/

~system]# vim nginx.service

2、nginx.service配置信息内容

[unit]
Description=nginx
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
控制nginx的常用命令

启动nginx

~]# systemctl start nginx.service (service可省略)

停止nginx

~]# systemctl stop nginx

重启nginx

~]# systemctl restart nginx

systemd 管理 apache httpd

yum 环境支持包:
~]# yum -y install apr apr-util pcre pcre-devel

官方网站 http://httpd.apache.org/

~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.33.tar.gz

~]# cd  httpe-2.4.33

~]# ./configure 

~]# make && make install
systemd 服务管理命令配置文件/usr/lib/systemd/system 下的 httpd.service
[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

启动服务

~]# systemctl start httpd.service

停止服务

~]# systemctl stop httpd

重启服务

~]# systemctl restart httpd

参考资料:

马哥linux笔记 网络笔记


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

文本三剑客之 awk

awk是一种报表生成器,可以将编辑的文本进行格式化排版处理后以更加美观的形式输出。在linux上使用的awk是GUN awk简称gawk。gawk是awk的套接字文件因此两者相同。

gawk – pattern scanning and processing language(模式扫描及处理语言)

gawk是一种过程式编程题语言,并且支持:
  • 条件判断
  • 数组
  • 循环也可以称为脚本语言解释器

基本用法:

gawk [OPTIONS] ‘program’ FILE …

OPTIONS选项:

  • -F[]:指明输入字字段分隔符;
  • -v VAR_NAME=VALUE:变量赋值;
  • -f/PATH/FRPM/AWKSCRIPT;

程序program:PATTERN{ACTION STATEMENTS}

  • 译-程序:模式{动作语句}

动作语句即用法 :

1、 print

用法: print item1,item2,…

item1值 可作为字符串,用双引号引用 作为变量被引用 * 数值引用,无需添加引号

注意及要点: item值需要使用单引号。 多个item之间需要使用逗号分隔,逗号显示为空白符。 print $0显示整段内容时,$0可忽略不写 输出的item值可以为字符串或数字、当前记录的字段($#)、变量或awk的表达式会转换为对应的字符串显示。 * 输出空白行可使用 awk ‘{print “” }’。

示例:

1、打印/etc/passwd 的后5行输出”one”,”two”和源文件的第3列,在尾部插入数字666

~]# tail -5 /etc/passwd | awk -F: '{print "one","two",$3,666}'

2、中间引用并且使用:符号分隔

 ~]# tail -5 /etc/fstab | awk '{print "hello:::::::",$3 }'

3、打印/etc/fstab下的空个

~]# tail -5 /etc/fstab | awk '{print ""}'

2、变量

  • FS: input Field Swperator,输出字段分隔符,默认为空白。
  • RS:input Record Seperator,输入时的字段分隔符,默认为换行符。
  • OFS:Output Field Seperator,输出是的字段分隔符,默认为空白字符。
  • ORS:output record seperator,输出时的换行符。
  • NF:number of field,字段数量(引用$变量式不能加$符号,引用字段的时候需要好似用$符号)(例如:print NF,print $NF)
  • NR:number of record,行数。
  • FNR:个文件分别计数,行数。
  • FILENAME:当前文件名。
  • ARGC:命令行参数的个数。
  • ARGC:数组,保存的是命令那个行所给定的各参数。

示例:

1、FS:默认空白符,可忽略

~]# tail -5 /etc/passwd | awk -v FS=':' '{print $2,$4}'

2、RS:以/为换行符

~]# tail -5 /etc/passwd | awk -v RS='/' '{print }'

3、打印/etc/passwd下行数

~]# awk '{print NR,$0}' /etc/passwd

2.2、 自定义变量

有两种方式: -v var=value 变量名区分大小写; 在program中直接定义

示例:

1、自定义变量space=date在/etc/passwd的每一行打印出来

~]# awk -v space='date' '{print space }' /etc/passwd

另一种无需给出定义文件表现形式

~]# awk -v space='date' 'BEGIN{print space}'

2、直接program中定义space=date

~]# awk '{space="date";print space}' /etc/passwd

另一种无需给出定义文件表现形式

~]# awk 'BEGIN{space="date";print space}'

3、printf 命令:

格式化的输出机制:

awk [OPTION] printf FORMAT,item1,item2,…

格式符: %c:显示字符的ASCII码。 %d,%i:显示十进制的整数。 %e,%E: 科学计数法数值显示。 %f:显示为浮点数。%g,%G: 以科学计数法或浮点数形式显示数值。 %s: 显示字符串。 * %%;显示%自身。

修饰符:

  • [#]: 第一个数字控制显示的宽度,第二个#标示小数点后的精度。例如: %3.1f

  • -#:左对齐。
  • +#:右对齐,可忽略不写

(#) 代表数字。

注意要点:
  • FORMAT必须给出。
  • 不会自动换行,需要显示给出换行控制符,\n
  • FORMA 中需要分别为后面的每个itme指定一个格式化符号。

示例

1、打印/etc/passed/以:为分隔的第二列以字符串的形式。

~]# tail -2 /etc/passwd | awk -F: '{printf "%s\n",$2}'

2、打印/etc/passwd/以:为分隔符的username和bin 并且左对齐的方式。

~]# awk -F: '{printf "username: %-25s  Bin:%s\n",$1,$6}' /etc/passwd

3、打印/etc/passwd/以:为分隔符的UID和GID 并且右对齐

~]# awk -F: '{printf "UID:%9d  |  GID:%9d\n",$3,$4}' /etc/passwd

4、awk的操作符

awk的操作符 算数操作符:进行算数运算, -x:负值 * +x:转换为数值

例如: x+y,x-y,xy,x/y,x^y,x%y 字符操作符:字符串连接 赋值操作符:通常为变量的赋值,赋值操作符有: =,+=,-=,=,/=,%=,^= ++ ,– 比较长政府:字符串或者数值的大小比较 ,>,>=,<,<=,==,!= 模式匹配操作符:根据右侧的模式进行匹配操作符 ~:是否能由右侧指定的模式所匹配。 !~:是否不能有右侧指定模式所匹配。 逻辑操作符:进行逻辑的运算&&:与运算 ||:或运算 条件表达式: selector?if-true-expression:if-false-expression (条件为真:条件为假) 函数调用:调用函数进行数据的处理 格式: function_nam(argu1,argu2,..) (参数1,参数2,…)

示例:

1、判断/etc/passwd/用户id是系统用户还是管理用户。

awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or Sysuser";printf"%-15s:%s\n",$1,usertype}' /etc/passwd

5、PATTERN 模式:对哪些内容进行处理。

  • empty:控模式,匹配所有行;
  • /Regular Expression/:仅将ACTION应用于能被Regular Expression所匹配到的行。
    • (例如:awk -F:’/^[ab]/{print $1,$3}’ /etc/passwd)
  • relational expression: 关系表达式,即结果为“真”、“假”的表达式,或这其结果能类同于“真”或“假”的表达:一般来说,其结果为非0数值或非空字符串即可类同为“真”,否则,类同为“假”。
    • (例如: awk -F:’$3>=500{print $1,$3}’/etc/passwd)
    • (例如: awk -F:’$1~/root/{print $1,$3}’ /etc/passwd)
  • line ranges:行范围,类sed或vim中的地址定界方式如:startline,endline(起始行,结束行)
  • BEGIN/END:两个特殊模式。
    • BEGIN:仅处理文本前执行一次
    • END:仅处理文本完成后执行一次

      示例:

      显示当前登陆的root用户

      [aaa@MiWiFi-R3-srv ~]$ who | awk '$1~/root/{print $1,$3,$4}'
      root 2018-03-30 11:01
      root 2018-03-30 11:01
      root 2018-03-31 05:42
      root 2018-03-31 06:09

6、常用ACTION

  • EXPRESSIONS:例如变量赋值。
  • Control Statements:控制语句,例如if、while等
  • Compound Statements:复合语句。
  • input statements
  • output statements

7、控制语句

7.1、if-else

语法: if(condition) {statements}[else{statement}]

使用场景:对awk去的的整行或某字段做条件判断。

示例:
~]# awk -F: '{if($3=$4) print $1,$3,$4}' /etc/passwd

7.2、while循环

语法:while(condition) {statement}

使用场景:对一样内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用。

示例:

7.3、do-while循环

语法:do {statement} while (condition)

意义:至少一次执行一次循环体

7.4 for循环

语法:for (expr1;expr2;expr3) {statement}

for (expr1;expr2;expr3) {statements}

for (variable assinment;codition;iteration process){for-body}

特殊用法:能够遍历属数组中的元素:

语法: for (var in array) {for-body}

for (变量 数组名)

7.5 switch语句 (类似多分支的if语句case)

语法: switch (expression){case VALUE or /REGEXP/:statement;…;default:statementN}

7.6 break和continue

break [n]:退出当前循环,n是一个数字,用于指定退出几层循环。 continue:提前结束本轮循环而进入下一轮。

7.7 next

提前结束对本行文本的处理,而提前进入下一行的处理操作。

示例:

8、array 数组

关联数组:array[index-expression]

数组[表达式]

index-expression: 可以使用任意字符串,字符串需要使用双引号。 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其初始化为“空串”

若要判断数组中是否存在某元素,要使用”index in array” 格式进行。

weekdays[mon]=”Monday”

若要遍历数组中的每个元素,要使用for循环的方式进行。var_name会遍历array的每个索引,所示显示数组元素的值,要使用array[var_name]:

for (var in arry) {for-body}


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

9、函数

9.1 内建函数:
  • 数值处理:rand():返回0至1之间的一个随机数.
  • 字符串处理:
    • length([s]):返回指定的字符串的长度。
    • sub(r,s[t]):基于r所标示的模式来匹配字符串t中的内容,将其第一次匹配到的内容替换为s所表示字符串。
    • gsub(r,s[t]):基于r所表示的模式来匹配字符串t中的内容,将其所有匹配懂啊的内容日环为s所表示的字符串。
    • split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中。

注意:awk的数组下标从1开始编号,而非0.

awk ‘{split($0,userinfo,”:”);print userinfo[1]}’/etc/passwd

substr(s,i[,n]):从s所表示的字符串中取子串,取法:从i表示的位置开始,取n个字符;时间类函数:systime(),取当前系统实际按,结果形式为时间戳;

示例:

length

 ~]# awk 'length>80' /etc/passwd

sub

~]# netstat -tan | awk 'sub(/tcp/,"ccc")'

gsub

 ~]# cat /etc/fstab | awk 'gsub(/#/,"%")'

9.2 用户自定义函数

functrion f_name(p,q){ … }

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/94767

(0)
上一篇 2018-04-02 22:21
下一篇 2018-04-03 10:48

相关推荐

评论列表(1条)

  • 马哥教育
    马哥教育 2018-04-04 08:29

    赞,总结的比较全,其中通过systemd来管理服务在实际应用中是比较常用的,希望能够熟练使用;另外有一处while循坏的示例没有给出,可以后续给一下哈~