Linux系统管理之systemd、awk
2019-01-30 本文已影响0人
请叫我飘哥
1、systemd查看日志文件有隐藏该如何处理?
- systemd信息管理工具Journalctl
systemd拥有强大的处理与系统日志记录功能。在使用其它工具时,日志往往被分散在整套系统当中,由不同的守护进程及进程负责处理,这意味着我们很难跨越多种应用程序对其内容进行解读。相比之下,systemd尝试提供一套集中化管理方案,从而统一打理全部内核及用户级进程的日志信息。这套系统能够收集并管理日志内容,而这也就是我们所熟知的journal。Journal的实现归功于journald守护进程,其负责处理由内核、initrd以及服务等产生的信息。 - Journalctl工具常用选项
journalctl [OPTIONS...] [MATCHES...]- -a, --all
完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长。 - -f, --follow
只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项。 - -e, --pager-end
在分页工具内立即跳转到日志的尾部。 此选项隐含了 -n1000 以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n 选项覆盖。 - -n, --lines=
限制显示最新的日志行数。 --pager-end 与 --follow 隐含了此选项。 此选项的参数:若为正整数则表示最大行数; 若为 "all" 则表示不限制行数; 若不设参数则表示默认值10行。 - -o, --output=
控制日志的输出格式。 可以使用如下选项:- short
这是默认值, 其输出格式与传统的 syslog文件的格式相似, 每条日志一行。 - verbose
以结构化的格式显示每条日志的所有字段。 - export
序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输 。 - json
将日志项按照JSON数据结构格式化, 每条日志一行。 - cat
仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)。
- short
- --utc
以世界统一时间(UTC)表示时间 - --no-hostname
不显示来源于本机的日志消息的主机名字段。 此选项仅对 short 系列输出格式(见上文)有效。 - -x, --catalog
在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义、 问题的解决方案、支持论坛、 开发文档、以及其他任何内容。 并非所有日志都有这些额外的帮助文本 - -b
显示特定于某次启动的日志 - --list-boots
列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、 第一条日志的时间戳、最后一条日志的时间戳。 - -k, --dmesg
仅显示内核日志。隐含了 -b 选项以及 "_TRANSPORT=kernel" 匹配项。 - -t, --identifier=SYSLOG_IDENTIFIER
仅显示syslog识别符为 SYSLOG_IDENTIFIER 的日志项。 - -u, --unit=UNIT|PATTERN
仅显示属于特定单元的日志。 也就是单元名称正好等于 UNIT 或者符合 PATTERN 模式的单元。 这相当于添加了一个 "_SYSTEMD_UNIT=UNIT" 匹配项(对于 UNIT 来说), 或一组匹配项(对于 PATTERN 来说)。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
可以多次使用该选项以指定多个识别符。 - --user-unit=
仅显示属于特定用户会话单元的日志。 相当于同时添加了 "_SYSTEMD_USER_UNIT=" 与 "_UID=" 两个匹配条件。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。 - -p, --priority=
根据日志等级(包括等级范围)过滤输出结果。 日志等级数字与其名称之间的对应关系如下
"emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7) 。
若设为一个单独的数字或日志等级名称, 则表示仅显示小于或等于此等级的日志 (也就是重要程度等于或高于此等级的日志)。 若使用 FROM..TO.. 设置一个范围, 则表示仅显示指定的等级范围内(含两端)的日志。 此选项相当于添加了 "PRIORITY=" 匹配条件。 - -S, --since=, -U, --until=
显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志。 参数的格式类似 "2019-01-30 18:17:16" 这样。 如果省略了"时:分:秒"部分, 则相当于设为 "00:00:00" 。 如果仅省略了"秒"的部分则相当于设为 ":00" 。 如果省略了"年-月-日"部分, 则相当于设为当前日期。 除了"年-月-日 时:分:秒"格式, 参数还可以进行如下设置: (1)设为 "yesterday", "today", "tomorrow" 以表示那一天的零点(00:00:00)。 (2)设为 "now" 以表示当前时间。 (3)可以在"年-月-日 时:分:秒"前加上 "-"(前移) 或 "+"(后移) 前缀以表示相对于当前时间的偏移 - -F, --field=
显示所有日志中某个字段的所有可能值。 - -N, --fields
输出所有日志字段的名称 - --system, --user
仅显示系统服务与内核的日志(--system)、 仅显示当前用户的日志(--user)。 如果两个选项都未指定,则显示当前用户的所有可见日志。 - -M, --machine=
显示来自于正在运行的、特定名称的本地容器的日志。 参数必须是一个本地容器的名称。 - -D DIR, --directory=DIR
仅显示来自于特定目录中的日志, 而不是默认的运行时和系统日志目录中的日志。 - --file=GLOB
GLOB 是一个可以包含"?"与"*"的文件路径匹配模式。 表示仅显示来自与指定的 GLOB 模式匹配的文件中的日志, 而不是默认的运行时和系统日志目录中的日志。 可以多次使用此选项以指定多个匹配模式(多个模式之间用"OR"逻辑连接)。 - --root=ROOT
在对日志进行操作时, 将 ROOT 视为系统的根目录。 例如 --update-catalog 将会创建 ROOT/var/lib/systemd/catalog/database
- -a, --all
- 常用示例
- 不带任何选项与参数,表示显示全部日志
journalctl
- 仅指定一个匹配条件, 显示所有符合该匹配条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service
- 指定了两个不同字段的匹配条件, 显示同时满足两个匹配条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=8080
- 指定了同一个字段的两个不同匹配条件, 显示满足其中任意一个条件的日志
journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service
- 使用 "+" 连接两组匹配条件, 相当于逻辑"OR"连接
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=28097 + _SYSTEMD_UNIT=dbus.service
- 显示所有 D-Bus 进程产生的日志
journalctl /usr/bin/dbus-daemon
- 显示上一次启动所产生的所有内核日志
journalctl -k -b -1
- 持续显示 apache.service 服务不断生成的日志
journalctl -f -u apache
- 显示隐藏字段
journalctl -o verbose
- 不带任何选项与参数,表示显示全部日志
2、自己动手写一个systemd的配置文件, 让nginx服务可以开机启动
- service unit file组成
文件通常由三部分组成- Unit:定义与Unit类型无关的通用选项,用于提供unit的描述信息,unit行为及依赖关系。
- Service:与特定类型相关的专用选项;此处为Service类型。
- Install:定义由“systemctl enable”以及“systemctl disable”命令在实现服务启用或禁用时的一些选项
- Unit段的常用选项:
- Description:描述信息;意义性描述
- After:定义unit的启动次序;表示当前Unit应该晚于那些unit启动,其功能与before想法
- Requies:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit即无法激活
- Wants:依赖到的其它units,弱依赖
- Conflicts:定义units间的冲突关系
- Service段的常用选项:
- Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型
常用类型:
simple
forking
oneshot
dbus
notify
idle
- Environmentfile:环境配置文件
- ExecStart;指明启动unit要运行命令脚本;ExecStartPre; ExecStartPost
- ExecStop:指明停止unit要运行的命令或脚本
- ExecReload:指明重载时kill选项
- Restart:指明重启使运行脚本
- Type:用于定义影响ExecStart及相关参数的功能的unit进程启动类型
- Install段的常用选项
- Alias:别名
- RequiredBy:被哪些units所依赖,强依赖
- WantedBy:被哪些units所依赖,弱依赖
- 编辑文件
root@node01 ~]# cd /usr/lib/systemd/system
[root@node01 system]# vim nginx.service
[Unit]
Description=nginx web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/nginx.pid
ExecStartPre=/usr/bin/rm -f $PIDFile
ExecStartPre=/usr/local/nginx/nginx -t
ExecStart=/usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf
ExecReload=/usr/local/nginx/nginx -s reload
ExecStop=/usr/local/nginx/nginx -s stop
[Install]
WantedBy=multi-user.target
- 激活、加载、启动
[root@kernel_update system]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@kernel_update system]# systemctl start nginx.service
[root@kernel_update system]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:80 *:*
LISTEN 0 10 10.192.2.221:53 *:*
LISTEN 0 10 127.0.0.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:953 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 10.192.2.221:22 10.192.52.63:56916
ESTAB 0 0 10.192.2.221:22 10.192.52.63:58931
LISTEN 0 10 ::1:53 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:953 :::*
LISTEN 0 100 ::1:25 :::*
[root@kernel_update system]# systemctl status nginx
● nginx.service - nginx web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since 三 2019-01-30 16:49:45 CST; 23s ago
Process: 1708 ExecStart=/usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Process: 1704 ExecStartPre=/usr/local/nginx/nginx -t (code=exited, status=0/SUCCESS)
Process: 1700 ExecStartPre=/usr/bin/rm -f $PIDFile (code=exited, status=0/SUCCESS)
Main PID: 1710 (nginx)
CGroup: /system.slice/nginx.service
├─1710 nginx: master process /usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf
└─1711 nginx: worker process
1月 30 16:49:45 kernel_update systemd[1]: Starting nginx web server...
1月 30 16:49:45 kernel_update nginx[1704]: nginx: the configuration file /usr/local/nginx/nginx.conf syntax is ok
1月 30 16:49:45 kernel_update nginx[1704]: nginx: configuration file /usr/local/nginx/nginx.conf test is successful
1月 30 16:49:45 kernel_update systemd[1]: Started nginx web server.
[root@node01 system]# systemctl daemon-reload
3、SIGHUP、SIGQUIT、SIGTERM、SIGINTERRUPT的区别
信号(signal)是Linux进程间通信的一种机制,全称为软中断信号,也被称为软中断。信号本质上是在软件层次上对硬件中断机制的一种模拟。
linux操作系统支持的信号种类。我们使用kill -l 命令查看,如下
[root@node01 ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[root@node01 ~]#
常见信号说明:
- SIGHUP 1
终端挂起或控制进程终止。当用户退出Shell时,由该进程启动的所有进程都会收到这个信号,默认动作为终止进程。 - SIGINT 2
键盘中断。当用户按下<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。 - SIGQUIT 3
键盘退出键被按下。当用户按下<Ctrl+D>或<Ctrl+>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为退出程序。 - SIGFPE 8
发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默认动作为终止进程并产生core文件。 - SIGKILL 9
无条件终止进程。进程接收到该信号会立即终止,不进行清理和暂存工作。该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。 - SIGALRM 14
定时器超时,默认动作为终止进程。 - SIGTERM 15
程序结束信号,可以由 kill 命令产生。与SIGKILL不同的是,SIGTERM 信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。
4、用awk查看tcp连接处于TIMEOUT的连接个数
思路:
1、ss -tan 显示只有tcp连接的状态
[root@node01 ~]# ss -tan
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 10 10.192.2.222:53 *:*
LISTEN 0 10 127.0.0.1:53 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 127.0.0.1:953 *:*
LISTEN 0 100 127.0.0.1:25 *:*
ESTAB 0 52 10.192.2.222:22 10.192.52.63:53269
LISTEN 0 128 :::80 :::*
SYN-RECV 0 0 ::1000:0:ccc2:c7b8:0:0%if360615604:80 ::1986:cbdf:1986:cbdf:57310
SYN-RECV 0 0 0:0:200::%if360615604:80 ::b2d9:c3fe:b3d9:c3fe:57309
LISTEN 0 10 ::1:53 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:953 :::*
LISTEN 0 100 ::1:25 :::*
ESTAB 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57298
ESTAB 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57306
ESTAB 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57308
ESTAB 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57307
TIME-WAIT 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57293
TIME-WAIT 0 0 ::ffff:10.192.2.222:80 ::ffff:10.192.52.63:57294
[root@node01 ~]#
2、我们看到状态信息在第一列。我们在利用awk 数组的特性如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
我们在计算数组中的元素个数。
[root@node01 ~]# ss -tan |awk '{state[$1]++}END {for(i in state)print i, state[i]}'
SYN-RECV 2
LISTEN 10
ESTAB 5
State 1
TIME-WAIT 4
[root@node01 ~]#
3、这里已经得到了所有我们想要的状态信息。这里我们再用grep过滤一下即可,也可以直接使用awk进行过滤
[root@node01 ~]# ss -tan |awk '{state[$1]++}END {for(i in state)print i, state[i]}' |grep "LISTEN"
LISTEN 10
[root@node01 ~]# ss -tan |awk '/LISTEN/ {state[$1]++}END {for(i in state)print i, state[i]}'
LISTEN 10