systemd以及awk等相关用法

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

Systemd

POST--->Boot sequeue(BIOS)--->Bootloader(MBR)--->kernel(ramdisk)--->rootfs--->/sbin/init

init

  • CentOS 5: SysV init
  • CentOS 6: Upstart
  • CentOS 7: Systemd

Systemd的新特性

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

核心概念: unit

  • unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其他于init相关的信息;这些配置文件主要保存在下面的路径文件中

/usr/lib/systemd/system
/etc/systemd/system
/run/systemd/system

unit的常见类型

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文件
  • systemctl命令:
    • Control the systemd system and service manager
    • systemctl [OPTIONS...] COMMAND [NAME...]
动作 CentOS 6 CentOS 7
启动 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.service
重载或条件式重启 systemctl reload-or-try-restart NAME.service
查看某服务当前激活与否的状态 systemctl is-active NAME.service
查看所有已激活的服务 systemctl list-units --t service
查看所有服务(包含未激活) chkconfig --list systemctl list-units -t NAME.service -a
设置服务开机自启 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 umask NAME.service
查看服务依赖关系 systemctl list-dependencies NAME.service

管理target units:

  • 运行级别:
运行级别 对应别名 服务名
0 runlevel0.target poweroff.target
1 runlevel1.target rescue.target
2 runlevel2.target multi-user.target
3 runlevel3.target multi-user.target
4 runlevel4.target multi-user.target
5 runlevel5.target graphical.target
6 runlevel6.target reboot.target
  • 模式切换
动作 命令操作
级别切换 init N ==> systemctl isolate NAME.target
查看级别 runlevel ==> systemctl list-units -t 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 hybird-sleep

service unit file

  • 文件通常由三部分组成:
    • [Install]: 定义由"systemctl enable"以及"systemctl disable"命令在实现服务启用或禁用时用到的一些选项
  • Unit段的常用选项:
    • Description: 描述信息; 意义性描述;
    • After: 定义unit启动次序; 表示当前unit应该晚于哪些unit启动; 其功能与Before相反;
    • requles: 依赖到的其他units; 强依赖,被依赖的units无法激活时,当前unit即无法激活;
    • Wants: 依赖到的其他units; 弱依赖,被依赖的units无法激活时,当前unit不影响;
    • Conflicts: 定义units间的冲突关系;
  • Service段的常用选项:
    • Type: 用于定义影响ExecStart及相关参数的功能的unit进程启动类型;
      • 类型:
        • simple: 默认值,表示由ExecStart所指名的程序为主进程
        • forking: 由ExecStart所指名的程序生产的多个子进程有一个会成为主进程
        • oneshot: 由ExecStart所指名的程序中的子进程成为主进程后,原有主进程便退出
        • dbus: 后续进程只有当主进程得到dbus后才能被使用
        • notify: 类似于simple
        • idle:
      • EnvironmentFile: 环境配置文件
      • ExecStart: 指名启动unit要运行命令或脚本;ExecStartPre,ExecStartPost
      • ExecStop: 指名停止unit要运行的命令或脚本
      • Restart:
    • Install段的常用选项:
      • Alias: 当前unit的别名
      • RequiredBy: 被哪些units所依赖
      • WantedBy: 被哪些units所依赖

注意: 对于新创建的unit文件或修改了的unit文件,要通知systemd重载此配置文件

systemctl daemon-reload

==================================================================================

编译安装nginx\apache,并通过systemd来管理.

(第一步)====创建用户配置环境====

[root@centos7 ~]#yum install -y pcre
[root@centos7 ~]#yum install -y pcre-devel
[root@centos7 ~]#yum install -y openssl-devel
[root@centos7 ~]#useradd nginx
[root@centos7 ~]#echo "nginx"|passwd --stdin nginx

(第二步)====下载tar包并解压配置====

NGINX官网 http://nginx.org/

[root@centos7 ~]#tar -zvxf nginx-1.15.5.tar.gz -C /usr/local/
[root@centos7 ~]#cd /usr/local/nginx-1.15.5/
[root@centos7 nginx-1.15.5]#./configure
[root@centos7 nginx-1.15.5]#make && make install

(第三步)====编辑配置文件====

[root@centos7 system]#cd /usr/lib/systemd/system
[root@centos7 system]#vim 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====

[root@centos7 system]#systemctl start nginx.service
[root@centos7 system]#systemctl stop nginx.service
[root@centos7 system]#systemctl restart nginx.service


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

基本用法:

  • awk [options] 'program' FILE....
    • program: PATTERN {ACTION STATMENTS}
      • 语句之间用分号分隔
      • print, printf
    • 选项:
      • -F: 指明输入时用到的字段分隔符;
      • -v: var=value: 自定义变量;

print

  • print item1,item2,....
  • 要点:
    • (1) 逗号分隔符
    • (2) 输出的各item可以是字符串,也可以是数值; 当前记录的字段、变量或awk的表达式.
    • (3) 如果省略item,相当于print $0

变量

  • 内建变量
    • FS: input field seperator,默认为空白字符;
    • OFS: output field seperator,默认为空白字符;
    • RS: input record seperator, 输入时的换行符;
    • ORS: output record seperator, 输出时的换行符
    • NF: number of field, 字段数量
      • {print NF},{print $NF}
    • NR: number of record, 行数(行号)
    • FNR: file number of record, 行数(行号)
    • FILENAME: 当前文件名
    • ARGC: 命令行参数个数
    • ARGV: 数组,保存的是命令行中所给定的各参数
  • 自定义变量
    • (1) -v var=value
      • 变量名区分字符大小写
    • (2) 在program中直接定义

print命令

  • 格式化输出: printf FORMAT, item1,item2....
    • (1) FORMAT是必须给出
    • (2) 不会自动换行,需要显式给出换行控制符.\n
    • (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
    • 格式符:
      • %c: 显示字符的ASCII码
      • %d,%i: 显示十进制整数
      • %e,%E: 科学计数法数值显示
      • %f: 显示为浮点数
      • %g,%G: 以科学计数法或浮点形式显示数值;
      • %s: 显示字符串
      • %u: 显示无符号整数
      • %%: 显示%本身
    • 修饰符:
      • %3.1f
      • -: 左对齐
      • +: 显示数值的符号

操作符

  • 算术操作符:
    • x+y, x-y, x*y, x/y, x^y, x%y
    • -x
    • +x: 转换为数值
  • 字符串操作符: 没有符号的操作符,字符串连接
  • 赋值操作符:
    • =, +=, -=, *=, /=, %=, ^=
    • ++, - -
  • 比较操作符:
    ->, >=, <, <=, !=, ==
  • 模式匹配符:
    • ~: 左侧的字符串是否能被右侧的字符串匹配
    • !~: 左侧的字符串是否不能被右侧的字符串匹配
  • 逻辑操作符:
    • &&
    • ||
    • !
  • 函数调用:
    • function_name(argu1,argu2,....)
  • 条件表达式:
    • selector?if-true-experession:if-false-experession

示例1: 判断用户UID,若大于等于1000为普通用户,否则,为系统用户或管理用户,且显示出对应的结果;

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

PATTERN

  • (1) empty: 空模式,匹配每一行;
  • (2) /regular expression/: 仅处理能够被此处的模式匹配到的行;
  • (3) relational expression: 关系表达式;结果有"真"有"假".结果为"真"才会被处理;
    • 真: 结果为非0值,非空字符串;
  • (4) line ranges: 行范围
    • startline,endline: /pat1/,/pat2/
    • 注意: 不支持直接给出数字的格式

示例2: 求/etc/passwd中第二行到第十行的用户,并显示出来;

[root@centos7 ~]#awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
  • (5) BEGIN/END模式
    • BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
    • END{}: 仅在文本处理完成之后执行一次;
  • (6) 常用的action
      1. Expressions
      1. Control statements: if, while等
      1. Compound statements: 组合语句
      1. input statements
      1. output statements
  • (7) 控制语句
    • if(condition) {statements}
    • if(condition) {statements} else {statments}
    • while(condition) {statements}
    • do {statements} while(condition)
    • for(expr1;expr2;expr3) {statements}
    • break
    • continue
    • delete array[index]
    • delete array
    • exit
    • {statements}

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

使用场景: 对awk取得的整行或某个字段做条件判断;

示例3: 以if语句判断用户UID,若大于等于1000为普通用户,否则,为系统用户或管理用户,且显示出对应的结果

[root@centos7 ~]#awk -F: '{if($3>=1000){printf "Common User: %s\n",$1}else{printf "root or Sysusers: %s\n",$1}}' /etc/passwd

示例4: 如果某个字段个数大于5个,则显示出来

[root@centos7 ~]#awk '{if(NF>=5) print $0}' /etc/fstab 

示例5: 对df里占用比这一字段进行监控,若设备的占用比超过20%则显示出这一设备名称.

[root@centos7 ~]#df -h|awk -F[%] '/^\//{print $1}'|awk '{if($NF>=20)print $1}' 
/dev/sda1
  • (7.2) while循环
    • 语法: while(condition) {statements}
      • 条件为"真",进入循环; 条件为"假",退出循环;

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

示例6: 对/etc/grub2.cfg中以空格或linux16开头的行进行处理,取出该行内每个字段具体的长度个数;

[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg

示例7: 对上述结果,取出长度大于等于7的字段

[root@centos7 ~]#awk '/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=7){print $i,length($i)};i++}}' /etc/grub2.cfg 
  • (7.3) do-while循环

    • 语法: do statement while(condition)
      • 意义: 至少执行一次
  • (7.4) for循环

    • 语法: for(expr1;expr2;expr3) statement
      • for(variable assignment;condition;interation process){for-body}
    • 特殊用法:
      • 能够遍历数组中的元素
      • 语法: for(var in array) {for-body}
  • (7.5) switch语句

    • 语法: switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ......; default: statement}
  • (7.6) break和continue

    • break [n]
    • continue
  • (7.7) next:

    • 能提前结束对本行的处理,而直接进入下一行
  • (8). array数组

    • 关联数组: array[index-expression]
      • index-expression:
        • (1) 可使用任意字符串(字符串要加双引号)
        • (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为"空串"
        • 若要判断数组中是否存在某元素,要使用"index in array"格式进行
        • weekdays["mon"]="Monday"
      • 若要遍历数组中的每个元素,要使用for循环
        • for(var in array) {for-body}

注意: var会遍历array的每个索引;


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

函数

  • 内置函数
  • 数值处理:
    • rand(): 返回0和1之间的一个随机数
    • 字符串处理:
      • length([s]): 返回指定字符串的长度
      • sub(r,s,[t]): 以r表示的模式来查找t所表示的字符串中的匹配的内容,并将其第一次出现替换为s所表示的内容;
      • gsun(r,s,[t]): 全局替换
      • split(s,a,[r]): 以r为分隔符,去切割字符串s,并将切割后的结果保存至a所表示的数组中;
  • 自定义函数

示例:
随机数

[root@centos7 ~]#awk '{print rand()}' /etc/passwd

字符串处理

[root@centos7 ~]#awk 'length>80' /etc/passwd
[root@centos7 ~]#netstat -tan|awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'

你可能感兴趣的:(systemd以及awk等相关用法)