Systemd的特性与常见unit类型及awk简介

一、systemd的新特性及unit常见类型


systemd即为system daemon,是Centos 7上用于替换init启动进程的新的启动进程。systemd出现的主要目的为减少系统引导时间和计算开销。Linux系统使用Systemd引导程序取代传统的SysV init,Systemd兼容init开机启动脚本。

systemd的特性

  1. 系统引导时,其服务并行启动
  2. 按需激活进程
  3. 系统状态快照
  4. 基于依赖关系定义服务控制逻辑

systemd的核心概念:unit单元

systemd的unit用于对相关配置文件进行标识、识别和配置;unit文件中主要包含了系统服务、监听的socket、保存的快照以及其他的init相关的信息。这些unit文件主要保存在一下三个目录中:

/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,用于定义文件系统中的文件或者目录

unit的关键特性

系统支持的unit类型可通过命令systemctl -t help来进行查看。

  1. 基于socket的激活机制:socket与程序分离。systemd为支持此机制的服务监听socket,当接收到来自客户端的socket通信时,由systemd激活对应的服务,应答客户端的请求
  2. 基于bus的激活机制:基于总线的请求来激活设备
  3. 基于device的激活机制;当有设备接入到系统时,systemd会自动激活device、mount、automount等unit来识别、挂载、接入对应的设备
  4. 基于path的激活机制:当某个文件路径变得可用时或路径出现相应的文件时,激活相应的服务;
  5. 系统快照:保存各unit的当前状态信息于持久存储在设备中
  6. 向后兼容sysv init脚本:能够继续使用/etc/init.d/目录中的服务管理脚本
    不兼容的情况:
    1. systemctl的命令是固定不变的
    2. 不是由systemd启动的服务,systemctl无法与之通信

unit文件的组成

unit文件通常有Unit、Service、Install这三个段组成。其每个段的意义及常用选项如下:

  • [Unit]段:定义了与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等
    • Description:秒速信息;意义性描述。
    • After:定义unit的启动次序;表示当前unit应该晚于那些unit启动;功能与Before相反。
    • Requies:依赖到的其他units;强依赖,被依赖的units无法激活时,当前unit即无法激活
    • Wants:依赖的其他units;弱依赖。
    • conflicts:定义units间的冲突关系
  • [Service]段:与特定类型相关的专用选项,此处为service类型
    • type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型。类型包括:simple、forking、oneshot、dbus、notify、idle
    • EnvironmentFile:环境配置文件
    • ExecStart:指明启动unit要运行命令或脚本;ExecStartPre、ExecStartPost
    • ExecStop:指明停止unit要运行的命令或脚本
    • Restart:启动此项,意外终止会自动重启脚本
  • [Install]段:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启用或仅用时用到的一些选项。
    • Alias:别名
    • RequiredBy:被那些units所依赖
    • WantedBy:被那些units所依赖
      注意:对于新创建的unit文件或,修改了的unit文件,要通知systemd重载此配置文件:systemctl daemon-reload

使用systemctl管理系统服务

语法

systemctl [OPTIONS···] COMMAND [NAME···]

常用命令
下面为常用的systemctl子命令的使用格式以及在旧版本中对应的实现方式:

功能 新指令 旧指令
启动服务 systemctl start NAME.service service NAME start
停止服务 systemctl stop NAME.service service NAME stop
重启服务 systemctl restart NAME.service service NAME restart
查看服务状态 systemctl status NAME.service service NAME status
条件式重启 systemctl try-restart NAME.service service NAME condrestart
重载或重启服务 systemctl reload-or-try-restart NAME.service --
重载或条件式重启服务 systemctl reload-or-try-restart NAME.service --
查看某服务当前激活与否的状态务 systemctl is-active NAME.service --
查看所有以激活的服务 systemctl list-units --type service --
查看所有服务 systemctl list-units -t service --all(-a) --
设置服务开机自启 systemctl enable NAME.service chkconfig NAME on
禁止服务开机自启 systemctl disable NAME.service chkconfig NAME off
查看某服务是否能开机自启 systemctl is-enabled NAME.service chkconfig --list NAME
禁止某服务设定为开机自启动 systemctl mask NAME.service --
取消此禁止 systemctl unmask NAME.service --
查看服务的依赖关系 systemctl list-dependencies NAME.service --
查看所有运行级别 systemctl list-units -t target --all(-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 --
运行级别切换 systemctl isolate NAME.target init N

centos7中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.taget
  • 级别6:runlevel6.target或reboot.target

示例

1、查看服务的依赖关系

[root@localhost nginx]# systemctl list-dependencies nginx.service
nginx.service
● ├─-.mount
● ├─system.slice
● ├─var.mount
● └─basic.target
●   ├─alsa-restore.service
●   ├─alsa-state.service
●   ├─microcode.service
●   ├─rhel-dmesg.service
●   ├─selinux-policy-migrate-local-changes@targeted.service
●   ├─paths.target
●   ├─slices.target
●   │ ├─-.slice
●   │ └─system.slice
●   ├─sockets.target
●   │ ├─avahi-daemon.socket
●   │ ├─cups.socket
●   │ ├─dbus.socket
●   │ ├─dm-event.socket
●   │ ├─iscsid.socket
●   │ ├─iscsiuio.socket
●   │ ├─rpcbind.socket
●   │ ├─spice-vdagentd.socket
●   │ ├─systemd-initctl.socket
●   │ ├─systemd-journald.socket
●   │ ├─systemd-shutdownd.socket
●   │ ├─systemd-udevd-control.socket
●   │ ├─systemd-udevd-kernel.socket
●   │ ├─virtlockd.socket
●   │ └─virtlogd.socket
●   ├─sysinit.target
●   │ ├─dev-hugepages.mount
●   │ ├─dev-mqueue.mount
●   │ ├─dmraid-activation.service
●   │ ├─iscsi.service
●   │ ├─kmod-static-nodes.service
lines 1-36

2、查看服务是否处于激活状态

[root@localhost nginx]# systemctl is-active nginx.service
active

3、查看所有已激活的服务

[root@localhost nginx]# systemctl list-units --type service
  UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
  abrt-ccpp.service                  loaded active exited  Install ABRT coredump hook
  abrt-oops.service                  loaded active running ABRT kernel log watcher
  abrt-xorg.service                  loaded active running ABRT Xorg log watcher
  abrtd.service                      loaded active running ABRT Automated Bug Reporting Tool
  alsa-state.service                 loaded active running Manage Sound Card State (restore and store)
  atd.service                        loaded active running Job spooling tools
  auditd.service                     loaded active running Security Auditing Service
  avahi-daemon.service               loaded active running Avahi mDNS/DNS-SD Stack
  blk-availability.service           loaded active exited  Availability of block devices
  chronyd.service                    loaded active running NTP client/server
  crond.service                      loaded active running Command Scheduler
  cups.service                       loaded active running CUPS Printing Service
  dbus.service                       loaded active running D-Bus System Message Bus
  getty@tty1.service                 loaded active running Getty on tty1
  gssproxy.service                   loaded active running GSSAPI Proxy Daemon
  irqbalance.service                 loaded active running irqbalance daemon
  iscsi-shutdown.service             loaded active exited  Logout off all iSCSI sessions on shutdown
  kdump.service                      loaded active exited  Crash recovery kernel arming
  kmod-static-nodes.service          loaded active exited  Create list of required static device nodes for the current kernel
  ksm.service                        loaded active exited  Kernel Samepage Merging
  ksmtuned.service                   loaded active running Kernel Samepage Merging (KSM) Tuning Daemon
  libstoragemgmt.service             loaded active running libstoragemgmt plug-in server daemon
  libvirtd.service                   loaded active running Virtualization daemon
  lvm2-lvmetad.service               loaded active running LVM2 metadata daemon

4、psacct的unit文件

[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

二、文本处理三剑客之awk

awk命令是一种编程语言,用于在linux/unix下对文本和数据进行扫描和处理的工具,其数据来源可以为标准输入、文件、管道等等。awk命令会从第一行输入开始逐行扫描至最后一行,寻找其中匹配特定模式的行,并在相应的行上执行用户指定的操作。Awk命令的基本架构由模式匹配和处理动作组成,默认处理动作为print打印行。

语法

awk [options] 'program...' FILE...

选项参数

options:

  • -F fs:指明输入时字段分隔符
  • -v var=value:自定义变量
  • -f programfile:从文件中读取program命令

program

program语句的常用格式为:PATTERN{ACTION STATEMENTS},其中多个program语句之间用分号‘;’分割。

PATTERN:
  • PATTERN的格式为:
  1. empty:空模式,表示匹配每一行
  2. /regular expression/:仅处理能被此模式匹配到的行
  3. relational expression:关系表达式;结果为真才会被处理
  4. line ranges:行范围。startline,endline:/pat1/,/pat2/或者(NR>=2&&NR<=10)。不支持直接用数字表示的行号
  5. BEGIN{}和END{}:
    BEGIN{}:表示在开始处理行前执行一次指定的操作;
    END{}:表示在结束对行的处理后执行一次指定的操作
  • program语句的变量
  • 内建变量
    • FS:input field seperator,输入时分隔符,默认为空白字符 awk -v FS=':' '{print 1,4}' /etc/passwd
    • OFS:output field seperator,输出时分隔符,默认为空白字符
    • RS:input record Seperator,输入时换行符
    • ORS:output record Seperator,输出时换行符
    • NF:number of field,统计字段数。awk '{print NF}' /etc/fstab。显示最后一个字段awk '{print $NF}'
    • NR:number of record:行数
    • FNR:各文件分别统计行数
    • FILENAME:当前文件名
    • ARGC:命令行参数的个数
    • ARGV:数组,保存的是命令行所给定的各参数
  • 自定义变量
    • -v var=value:定义变量
    • 也可以在program语句中直接定义
ACTION

常用的action:

  • print:使用格式为print item1,item2,....
    • 逗号作为字段间的分隔符
    • 输出的各item可以是字符串、也可以是数值;当前记录的字段、变量或awk表达式
    • 如果省略item,相当于print $0,输出整行
  • printf:格式为printf FORMAT,item1,item2...
    • FORMAT必须给出
    • 不会自动换行,需要显示给出换行控制符\n
    • FORMAT中需要分别为后面的每个item制定一个格式化符号:
      • 格式符
        • %c:显示字符的ASCII码
        • %d,%i:显示十进制整数
        • %e,%E:科学计数法数值显示
        • %f:显示为浮点数
        • %g,%G:以科学计数法或浮点形式显示数据
        • %s:显示字符串
        • %u:无符号整数
        • %%:显示%自身
      • 修饰符:通过修饰符对格式符进行输出格式的整理
        • #[.#]:第一个#数字控制显示的宽度;第二个#表示小数点后的精度,如%3.1f
        • -:左对齐
        • +:显示数值的符号
      • 操作符:
        • 算术操作符:x[+|-|/|*|%|^|%]y,-x,+x转换为数值
        • 字符串操作符:没有符号的操作符,字符串连接
        • 赋值操作符:=、+=、-=、*=、/=、%=、^=、++、--
        • 比较操作符:>,>=,<,<=,!=,==
        • 模式匹配符::是否匹配,!:是否不匹配
        • 逻辑操作符:&&,||,!
        • 函数调用:function_name(arg1,arg2,...)
        • 条件表达式:awk [options] '{selector?if-true-expression:if-false-expression}' /PATH/TO/SOMFILE
  • expression表达式:
  • control statements:if,while控制语句
  • compound statements:组合语句
  • input statements:输入语句
示例

1、在program语句中自定义变量

[root@localhost ~]# ls -l | awk '/root/{hello="this is a test.";print $3,hello}'
root this is a test.
root this is a test.
root this is a test.

2、显示/etc/passwd中的用户名、uid和默认shell

[root@localhost ~]# 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

3、显示/etc/passwd中的用户名、uid,并右对齐

[root@localhost ~]# awk -F: '{printf "username:%15s,UID:%d\n",$1,$3}' /etc/passwd
username:           root,UID:0
username:            bin,UID:1
username:         daemon,UID:2
username:            adm,UID:3
username:             lp,UID:4
username:           sync,UID:5
username:       shutdown,UID:6
username:           halt,UID:7
username:           mail,UID:8
username:       operator,UID:11
username:          games,UID:12
username:            ftp,UID:14
username:         nobody,UID:99
username:            ods,UID:999
username:systemd-network,UID:192
username:           dbus,UID:81
username:        polkitd,UID:998
username:         apache,UID:48
username:        unbound,UID:997

4、根据用户ID判断对应用户是系统用户还是普通用户,显示结果左对齐

[root@localhost ~]#  awk -F:  '{$3>=1000?usertype="this is a common user.":usertype="This is a system user.";printf "%-20s:%-s\n",$1,usertype}' /etc/passwd
root                :This is a system user.
bin                 :This is a system user.
daemon              :This is a system user.
adm                 :This is a system user.
lp                  :This is a system user.
sync                :This is a system user.
shutdown            :This is a system user.
halt                :This is a system user.
mail                :This is a system user.
operator            :This is a system user.
games               :This is a system user.
ftp                 :This is a system user.
nobody              :This is a system user.
ods                 :This is a system user.
systemd-network     :This is a system user.
dbus                :This is a system user.
polkitd             :This is a system user.
apache              :This is a system user.
unbound             :This is a system user.
libstoragemgmt      :This is a system user.
rpc                 :This is a system user.

5、显示默认为shell类型为bash的用户

[root@localhost ~]# awk -F: '$NF=="/bin/bash"{print $1,$NF}' /etc/passwd
root /bin/bash
wxq /bin/bash
hadoop /bin/bash
bash /bin/bash
testbash /bin/bash
basher /bin/bash

awk的高级应用

awk语句中的控制语句

awk命令是一种编程语言,有相应的控制语句。其控制语句的类型与bash shell编程的类似,包括:if-else、while、for、switch、break、continue和next。其中break、continue用于跳出循环及跳出本次循环,next用于提前结束当前行的处理,直接进入下一行。

  • if-else语句
    awk命令的if-else语句通常用于对匹配的行或字段做条件判断选择,支持双分支if语句。其格式通常为:

awk [options] '{if (condition) {statements} [else {statements}] }' /PATH/TO/SOMEFILE
当使用了else语句时,if-else语句中的statements语句需要用{}括起来

示例

以冒号为分隔符,判断ID>=1000的用户ID为普通用户;

[root@localhost ~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
root or Sysuser: root
root or Sysuser: bin
root or Sysuser: daemon
root or Sysuser: adm
root or Sysuser: lp
root or Sysuser: sync
root or Sysuser: shutdown
root or Sysuser: halt
root or Sysuser: mail
root or Sysuser: operator
root or Sysuser: games
root or Sysuser: ftp
root or Sysuser: nobody
root or Sysuser: ods
root or Sysuser: systemd-network
root or Sysuser: dbus
root or Sysuser: polkitd
root or Sysuser: apache
root or Sysuser: unbound
root or Sysuser: libstoragemgmt
root or Sysuser: rpc
root or Sysuser: colord
root or Sysuser: rpcuser
Common user: nfsnobody
  • while循环语句
    while语句主要应用于对一行内多个字段逐一进行类似处理时使用,亦或者是对数组中的各元素逐一处理时使用。其语法格式通常为:

awk '[/PATTERN/]{while(condition) {statements}}' /PATH/TO/SOMEFILE

示例:

以空格开头0次或多次,后跟linux16的行,以空格为分隔符,只显示每行中字段的长度>=7的字段;

[root@localhost ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
  • do-while循环
    do-while循环的意义在于无论条件真假,循环体都会执行一次。也就是至少执行一次循环体。其语法格式为:

awk '[/PATTERN/]{do statements while(condition)}' /PATH/TO/SOMEFILE

  • for循环
    awk命令的for 循环常用于进行累加或遍历操作,如累计某个关键字出现次数、遍历数组等等。其常见的格式为:

awk '/PATTERN/{for(expr1;expr2;expr3) {循环体}}' /PATH/TO/SOMEFILE
expr1:控制变量初始化;
expr2:条件判断;
expr3:控制变量的数值修正表达式;
即:
awk '/PATTERN/{for(变量赋值;判断条件;条件变化) {循环体}}' /PATH/TO/SOMEFILE

示例:

以空格开头0次或多次,后跟linux16的行,以空格为分隔符,显示每行中各字段的长度。

[root@localhost ~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
crashkernel=auto 16
[root@localhost ~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
linux16 7
/vmlinuz-3.10.0-862.el7.x86_64 30
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
LANG=zh_CN.UTF-8 16
linux16 7
/vmlinuz-0-rescue-ee1d782742df449b86df71311eb27f85 50
root=UUID=934c9a34-c3a2-40e3-9696-4e4edda5ede4 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
  • switch语句
    awk的switch语句类似于bashshell编程的case语句,判断表达式的值符合case里面的哪个条件,可以等于case里的值,也可以是被case里的正则表达式匹配;如果符合条件就执行该case里的语句,不会往下判断了;类似case语句,只不过是关键字写法不同。其格式为:
awk [options] '{switch(CONDITION){case [VALUE|/PATTERN/]:statement;case [VALUE|/PATTERN/]:statement;...;default:statement}}'

示例
打印行号为6以及5的倍数的行的行号

[root@localhost ~]# awk -F: '{switch(NR+5){case 6:{print NR;next}; case /[[:digit:]]+0/: {print NR; next} ;default: print "-------------"}}' /etc/passwd
1
-------------
-------------
-------------
5
-------------
-------------
-------------
-------------
-------------
-------------
-------------
-------------
-------------

swk语句中的数组

awk命令也可以结合数组来完成一系列的工作,其数组格式为:

array[index-expression]

  • 其中index-expression可使用任意字符串,字符串要使用双引号括起来;
  • 如果数组中的元素事先不存在,在引用时,awk命令会自动创建此元素,并将其值初始化为“空串”。
  • 若要判断数组中是否存在某元素,要使用"index in array"格式进行

示例

[root@localhost ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday

若要遍历数组中的每个元素,要使用for循环;

即for(变量名 in 数组名) {循环体}
变量名中保存的是数组的索引,而不是数组中的元素;对应的变量var会遍历array数组的每个索引;

例如:
统计/etc/fstab文件中每个单词出现的次数。

[root@localhost ~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
UUID=4ef876f1-19ad-4cf6-b7f5-e54f96e818b5 1
man 1
UUID=4eabc87c-d983-4090-8a3c-6d1a3963c827 1
and/or 1
maintained 1
UUID=e7275fe6-32b3-4a7b-a90d-c8a39cb23af1 1
xfs 4
Wed 1
/var 1
Accessible 1
# 7

awk中的函数

awk命令也支持函数的编写,通常来说用得较多的为awk命令的几个内置函数。

  • 内置函数
  • length([s]):返回指定字符串的长度
  • sub(r,s,[t]):以r表示的模式来查找t所代表的字符串中的匹配的内容,并将其第一次出现替换为s所标识的内容
  • gsub(r,s,[t]):以r表示的模式来查找t所代表的字符串中的匹配的内容,并将其所有出现替换为s所标识的内容
  • split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的属组中。

例如:
显示来访的主机地址连接的次数。

[root@localhost ~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
0.0.0.0 6
192.168.2.112 1
  • 自定义函数
    其格式为:
function function_name(argument1,argument2,...)
{
function_body
}

function_name为用户定义的函数的名称,函数通常可以接受以逗号分割的多个arguments,参数是可选的;通常来说一个function_body是由一个或多个语句组成的。

例如:
打印UID大于100的用户名及用户UID。

[root@localhost ~]# awk -F: 'function test(a,b){if(b>100) printf "User:%-20s UID:%-10s\n",a,b};test($1,$3)' /etc/passwd
User:ods                  UID:999       
User:systemd-network      UID:192       
User:polkitd              UID:998       
User:unbound              UID:997       
User:libstoragemgmt       UID:996       
User:colord               UID:995       
User:nfsnobody            UID:65534     
User:saslauth             UID:994       
User:abrt                 UID:173       
User:setroubleshoot       UID:993       
User:rtkit                UID:172  

示例
打印九九乘法表。

[root@localhost ~]# awk 'BEGIN{for(n=1;n<=9;n++){for (i=1;i<=n;i++) printf i"x"n"="i*n" ";printf "\n"}}'
1x1=1 
1x2=2 2x2=4 
1x3=3 2x3=6 3x3=9 
1x4=4 2x4=8 3x4=12 4x4=16 
1x5=5 2x5=10 3x5=15 4x5=20 5x5=25 
1x6=6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36 
1x7=7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49 
1x8=8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64 
1x9=9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

三、编译安装NGINX,实现通过systemd管理。

1.在进行编译安装nginx前需要先进安装相关的依赖包,如下:

[root@localhost test1]# yum install gc gcc gcc-c++ pcre-devel zlib-devel openssl-devel

2.下载nginx,此处使用的是稳定版nginx-1.14.0,然后解压缩

[root@localhost test1]# wget  http://nginx.org/download/nginx-1.14.0.tar.gz
--2018-10-14 17:24:16--  http://101.110.118.70/nginx.org/download/nginx-1.14.0.tar.gz
正在连接 101.110.118.70:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1016272 (992K) [application/octet-stream]
正在保存至: “nginx-1.14.0.tar.gz”

100%[===========================================================================================>] 1,016,272   2.06MB/s 用时 0.5s   

2018-10-14 17:24:17 (2.06 MB/s) - 已保存 “nginx-1.14.0.tar.gz” [1016272/1016272])

[root@localhost test1]# ll
总用量 996
-rw-r--r--. 1 root root 1016272 4月  17 23:35 nginx-1.14.0.tar.gz
[root@localhost test1]# tar -zxvf nginx-1.14.0.tar.gz
nginx-1.14.0/
nginx-1.14.0/auto/
nginx-1.14.0/conf

4.创建nginx安装目录:/usr/local/nginx,并进入已解压出的源码包目录nginx-1.14.0.

[root@localhost test1]# mkdir /usr/local/nginx
[root@localhost test1]# cd nginx-1.14.0
[root@localhost nginx-1.14.0]# 

5.定义编译设置,./configure,这里只设置一个基本能使用的nginx即可,具体需要什么功能模块可自主选择,使用./configure --help 命令可以查看所有模块。若运行后没有报错,则可以进行编译安装。


[root@localhost nginx-1.14.0]# ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module 
checking for OS
 + Linux 3.10.0-862.el7.x86_64 x86_64
checking for C compiler ... found

6.进行编译安装:make && make install

[root@localhost nginx-1.14.0]# make && make install
make -f objs/Makefile
make[1]: 进入目录“/tmp/test1/nginx-1.14.0”
......
[root@localhost nginx-1.14.0]# cd /usr/local/nginx
[root@localhost nginx]# ll
总用量 4
drwxr-xr-x. 2 root root 4096 10月 14 17:54 conf
drwxr-xr-x. 2 root root   40 10月 14 17:54 html
drwxr-xr-x. 2 root root    6 10月 14 17:54 logs
drwxr-xr-x. 2 root root   19 10月 14 17:54 sbin

7.编译安装成功后,注意检查防火墙和selinux是否关闭,若未关闭需要关闭掉,以免影响输出结果。

[root@localhost nginx]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: active (running) since 日 2018-10-14 15:34:10 CST; 2h 28min ago
     Docs: man:firewalld(1)
 Main PID: 713 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─713 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

10月 14 15:34:10 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
10月 14 15:34:10 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
[root@localhost nginx]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@localhost nginx]# systemctl stop firewalld.service
[root@localhost nginx]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@localhost nginx]# getenforce  #检测selinux状态
Enforcing #此为开启状态
[root@localhost nginx]# setenforce 0  #关闭selinux
[root@localhost nginx]# getenforce
Permissive

8.编辑nginx的unit文件。
在/usr/lib/systemd/system/目录下新建一个名为nginx.service,编辑此文件并写入以下脚本并保存:

[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

9.创建并编辑完成nginx的unit文件之后,就可以运用systemd管理nginx服务了。
首先启动nginx服务:systemctl start nginx.service
然后用systemctl status nginx.service查看nginx服务的运行状态

[root@localhost nginx]# systemctl start nginx.service
[root@localhost nginx]# systemctl status nginx.service
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 日 2018-10-14 18:21:43 CST; 2s ago
     Docs: http://nginx.org/en/docs/
  Process: 6326 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
  Process: 6324 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 6328 (nginx)
    Tasks: 2
   CGroup: /system.slice/nginx.service
           ├─6328 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
           └─6329 nginx: worker process

10月 14 18:21:43 localhost.localdomain systemd[1]: Starting nginx - high performance web server...
10月 14 18:21:43 localhost.localdomain nginx[6324]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
10月 14 18:21:43 localhost.localdomain nginx[6324]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
10月 14 18:21:43 localhost.localdomain systemd[1]: Failed to read PID from file /usr/local/nginx/logs/nginx.pid: Invalid argument
10月 14 18:21:43 localhost.localdomain systemd[1]: Started nginx - high performance web server.

10.在浏览器中输入配置了nginx的服务器地址,出现以下页面,说明编译安装后运行成功。


nginx..png

11.可以使用以下命令对nginx服务进行管理

  • systemctl enable nginx.service:开机运行nginx
  • systemctl is-enabled nginx.service:开机运行nginx
[root@localhost nginx]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@localhost nginx]# systemctl is-enabled nginx.service
enabled
  • systemctl disable nginx.service:取消开机运行nginx
  • systemctl stop nginx.service:停止nginx
  • systemctl restart nginx.service:重启nginx
  • systemctl reload nginx.service:重新加载nginx配置文件
  • systemctl --failed:显示启动失败的服务
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容