系统引导时实现服务并行启动; 按需激活进程; 系统状态快照; 基于依赖关系定义服务控制逻辑;
unit由其相关配置文件进行标识、识别和配置;文件中主要包含了系统服务、监听的socket、保存的快照以及其它与init相关的信息; 这些配置文件主要保存在: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system
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文件
编译安装nginx服务
安装软件node
[root@node1 ~]# yum install -y pcre pcre-devel openssl-devel [root@node1 ~]# useradd nginx [root@node1 ~]# passwd nginx [root@node1 ~]# tar -vzxf nginx-1.13.3.tar.gz -C /usr/local [root@node1 ~]# cd nginx-1.13.3/ [root@node1 nginx-1.13.3]# ./configure \ > --group=nginx \ > --user=nginx \ > --prefix=/usr/local/nginx \ > --sbin-path=/usr/sbin/nginx \ > --conf-path=/etc/nginx/nginx.conf \ > --error-log-path=/var/log/nginx/error.log \ > --http-log-path=/var/log/nginx/access.log \ > --http-client-body-temp-path=/tmp/nginx/client_body \ > --http-proxy-temp-path=/tmp/nginx/proxy \ > --http-fastcgi-temp-path=/tmp/nginx/fastcgi \ > --pid-path=/var/lock/nginx \ > --with-http_stub_status_module \ > --with-http_ssl_module \ > --with-http_gzip_static_module \ > --with-pcre [root@node1 nginx-1.13.3]# make && make install
编辑文件,实现systemd管理linux
[root@node1 nginx-1.13.3]# cat /usr/lib/systemd/system/nginx.service [Unit] Description=Nginx Service [Service] Type=forking PIDFile=/usr/local/nginx/logs/nginx.pid ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload ExecStop=/usr/local/nginx/sbin/nginx -s stop
最后重启并关闭nginx
[root@node1 nginx-1.13.3]# /usr/local/nginx/sbin/nginx [root@node1 nginx-1.13.3]# /usr/local/nginx/sbin -s reload [root@node1 nginx-1.13.3]# /usr/local/nginx/sbin -s stop
文本三剑客之awk
awk是一种报表生成器,与sed,grep都是文本处理工具,能够将编辑的文本进行格式化排版处理后以更加美观的形式输出,在linux上使用的awk是GNUawk即gawk,gawk是awk的套接字文件,两者相同。express
基本用法:gawk [options] 'program' FILE ... program: PATTERN{ACTION STATEMENTS} 语句之间用分号分隔 选项: -F:指明输入时用到的字段分隔符; -v var=value: 自定义变量 一、print print item1, item2, ... 要点: (1) 逗号分隔符; (2) 输出的各item能够字符串,也能够是数值;当前记录的字段、变量或awk的表达式; (3) 如省略item,至关于print $0;
2.1 内建变量 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:各文件分别计数;行数; FILENAME:当前文件名; ARGC:命令行参数的个数; ARGV:数组,保存的是命令行所给定的各参数; 2.2 自定义变量 (1) -v var=value 变量名区分字符大小写; (2) 在program中直接定义
示例:apache
[root@node1 ~]# awk -F ':' '{print $1,$3}' /etc/passwd root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 games 12 ftp 14 nobody 99 systemd-network 192 dbus 81 polkitd 999 postfix 89 sshd 74 chrony 998 user1 1001 hadoop 1006 bash 1007 testbash 1008 basher 1009 nologin 1010 centos 1011 fedoer 1012 nginx 1013 [root@node1 ~]# awk -v FS=':' -v OFS='#' '{print $1,$3,$7}' /etc/passwd root#0#/bin/bash bin#1#/sbin/nologin daemon#2#/sbin/nologin adm#3#/sbin/nologin lp#4#/sbin/nologin sync#5#/bin/sync shutdown#6#/sbin/shutdown halt#7#/sbin/halt mail#8#/sbin/nologin operator#11#/sbin/nologin games#12#/sbin/nologin ftp#14#/sbin/nologin nobody#99#/sbin/nologin systemd-network#192#/sbin/nologin dbus#81#/sbin/nologin polkitd#999#/sbin/nologin postfix#89#/sbin/nologin sshd#74#/sbin/nologin chrony#998#/sbin/nologin user1#1001#/bin/bash hadoop#1006#/bin/bash bash#1007#/bin/bash testbash#1008#/bin/bash basher#1009#/bin/bash nologin#1010#/sbin/nologin centos#1011#/bin/bash fedoer#1012#/bin/bash nginx#1013#/bin/bash
格式化输出: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-expression:if-false-expression
示例:c#
[root@node1 ~]# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd root:Sysadmin or SysUser bin:Sysadmin or SysUser daemon:Sysadmin or SysUser adm:Sysadmin or SysUser lp:Sysadmin or SysUser sync:Sysadmin or SysUser shutdown:Sysadmin or SysUser halt:Sysadmin or SysUser mail:Sysadmin or SysUser operator:Sysadmin or SysUser games:Sysadmin or SysUser ftp:Sysadmin or SysUser nobody:Sysadmin or SysUser systemd-network:Sysadmin or SysUser dbus:Sysadmin or SysUser polkitd:Sysadmin or SysUser postfix:Sysadmin or SysUser sshd:Sysadmin or SysUser chrony:Sysadmin or SysUser user1:Common User hadoop:Common User bash:Common User testbash:Common User basher:Common User nologin:Common User centos:Common User fedoer:Common User nginx:Common User
(1) empty:空模式,匹配每一行; (2) /regular expression/:仅处理可以被此处的模式匹配到的行; (3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理; 真:结果为非0值,非空字符串; (4) line ranges:行范围, startline,endline:/pat1/,/pat2/ 注意: 不支持直接给出数字的格式 ~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd (5) BEGIN/END模式 BEGIN{}: 仅在开始处理文件中的文本以前执行一次; END{}:仅在文本处理完成以后执行一次;
示例:
定义一个数组,里面有三个元素,循环打印里面的元素各一次centos
[root@node1 ~]# awk 'BEGIN{weekday["mon"]="Monday";weekday["tue"]="Tuesday";weekday["wen"]="Wensday";for(i in weekday)print weekday[i]}' Wensday Tuesday Monday
显示fstab文件中每一个文件系统类型出现的次数,UUID开头的行的第三个字段表示挂载的文件系统类型数组
[root@node1 ~]# awk '/^UUID\>/{fs[$3]++}END{for(i in fs)print i,fs[i]}' /etc/fstab xfs 1
rand():返回0和1之间一个随机数;bash
length([s]):返回指定字符串的长度; sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容; gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其全部出现均替换为s所表示的内容; split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;
示例:app
[root@node1 ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}' 192.168.10.1 1 0.0.0.0 2 [root@node1 ~]# 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 2018 1 on 1 /etc/fstab 1 5 1 /boot 1 more 1 mount(8) 1 UUID=38a2a3be-952e-4541-814b-77553d4e9204 1 pages 1 '/dev/disk' 1 21:24:35 1 Sep 1 /dev/mapper/centos-swap 1 blkid(8) 1 See 1 /dev/mapper/centos-root 1 for 1 and/or 1 anaconda 1 / 1 findfs(8), 1 under 1 Created 1 0 6 info 1 Accessible 1 # 7 defaults 3 xfs 2 man 1 are 1 reference, 1 by 2 maintained 1 Wed 1