Linux系统管理之systemd、awk

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
        仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)。
    • --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
  • 常用示例
    • 不带任何选项与参数,表示显示全部日志
      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:指明重启使运行脚本
  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351