Systemd服务管理与journal日志管理指南

首先提供一个java启动的程序做成 systemd 的简单示例,以及journal配置日志持久化的示例

后面会有详细的systemd及journal使用指南

示例:详细配置见后文,unit文件字段详解

unit示例

[Unit]

After=network.target

Wants=network.target

[Service]

WorkingDirectory=/export/prod/server

Type=simple

ExecStart=/usr/bin/java -jar -Dspring.config.location=application.properties -Dlog4j2.formatMsgNoLookups=true server.jar

Restart=on-failure

RestartSec=1s

[Install]

WantedBy=multi-user.target

需要注意的:

WorkingDirectory=指定服务的工作目录

因为启动指定的application.properties 配置文件的时候没有用绝对路径,所以就要指定工作目录

RestartSec=Systemd 重启当前服务间隔的秒数,缺省是10ms,这里改成了1s

日志是归journal管,首先必须要持久化存储到磁盘

默认情况下,systemd 的日志保存在 /run/log/journal 中,系统重启会清除掉。

修改journal存储模式

sed -i "/^#Storage/cStorage=persistent" /etc/systemd/journald.conf

处理所需要的目录及重启服务

创建目录及重启服务

mkdir /var/log/journal

systemd-tmpfiles --create --prefix /var/log/journal

systemctl restart systemd-journald

把内存文件刷到磁盘

内存文件刷到磁盘

journalctl --flush

设置保存天数

设置保存天数

journalctl --vacuum-time=31d

按日期输出日志

按日期输出日志

journalctl -u circle --since "2022-10-19 14:30:00" --until "2022-10-19 15:00:00"

以上示例完毕。

---------------------------------------------------------------------------------------------------------------

journalctl详解:

Systemd 统一管理所有 Unit 的启动日志。可以只用journalctl一个命令,查看所有相关日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf。

查看日志(journalctl)

以flow形式查看日志,类似tail -f的效果

journalctl -f

journalctl -f

[root@cloud local]# journalctl -f

-- Logs begin at Mon 2021-01-04 19:16:30 CST. --

...

Jan 07 09:05:16 cloud.cn systemd[1]: Started Network Manager Script Dispatcher Service.

Jan 07 09:05:16 cloud.cn nm-dispatcher[1981]: req:1 'dhcp4-change' [ens32]: new request (2 scripts)

Jan 07 09:05:16 cloud.cn nm-dispatcher[1981]: req:1 'dhcp4-change' [ens32]: start running ordered scripts...

查看内核日志

journalctl -k

$ journalctl -k

[root@cloud local]# journalctl -k

-- Logs begin at Mon 2021-01-04 19:16:30 CST, end at Fri 2022-01-07 09:07:13 CST. --

....

Jan 07 16:51:31 zaishu.cn kernel: BIOS-e820: [mem 0x000000003ff00000-0x000000003fffffff] usable

Jan 07 16:51:31 zaishu.cn kernel: BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved

Jan 07 16:51:31 zaishu.cn kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved

Jan 07 16:51:31 zaishu.cn kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved

Jan 07 16:51:31 zaishu.cn kernel: BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved

Jan 07 16:51:31 zaishu.cn kernel: NX (Execute Disable) protection: active

查看指定服务日志

journalctl -u

journalctl -u

[root@cloud local]# journalctl -u mysql.service

-- Logs begin at Mon 2021-01-04 19:16:30 CST, end at Fri 2022-01-07 09:07:13 CST. --

Jan 07 09:03:30 cloud.cn systemd[1]: Starting MySQL Server...

Jan 07 09:03:31 cloud.cn mysqld[1771]: Starting MySQL.[ OK ]

Jan 07 09:03:31 cloud.cn systemd[1]: Started MySQL Server.

查看指定日期日志

journalctl -u redis-proxy.service --since "2022-12-02 00:00:00" --until "2022-12-02 11:00:00"

查看指定日期日志

[root@jumpserver system]# journalctl -u redis-proxy.service --since "2022-12-02 00:00:00" --until "2022-12-02 11:00:00"

-- Logs begin at Thu 2018-12-13 17:40:01 CST, end at Thu 2022-12-08 11:32:35 CST. --

Dec 02 09:35:32 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #7855 Opened :63790 >>> 39.105.9.234:6379

Dec 02 09:35:32 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #7855 Closed (14 bytes sent, 34 bytes recieved)

Dec 02 09:36:37 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #7856 Opened :63790 >>> 39.105.9.234:6379

查看指定级别日志

journalctl -p 7 -u redis-proxy.service

日志级别 操作系统提供了从0 (emerg) 到 7 (debug) 一共7个级别的日志,7个级别的含义为: 0: emerg 1: alert 2: crit 3: err 4: warning 5: notice 6: info 7: debug

查看指定级别日志

[root@jumpserver system]# journalctl -p 7 -u redis-proxy.service

-- Logs begin at Thu 2018-12-13 17:40:01 CST, end at Thu 2022-12-08 11:33:35 CST. --

Nov 25 16:45:43 jumpserver systemd[1]: Started redis-proxy.service.

Nov 25 16:45:43 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: go-tcp-proxy (1.0.2) proxing from :63790 to 39.105.9.234:6

Nov 25 16:49:09 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #001 Opened :63790 >>> 39.105.9.234:6379

Nov 25 16:49:09 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #002 Opened :63790 >>> 39.105.9.234:6379

Nov 25 16:49:09 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #006 Opened :63790 >>> 39.105.9.234:6379

Nov 25 16:49:09 jumpserver go-tcp-proxy_1.0.2_linux_amd64[32338]: Connection #008 Opened :63790 >>> 39.105.9.234:6379

……

查看日志占用的磁盘空间

journalctl --disk-usage

journalctl --disk-usage

[root@jumpserver system]# journalctl --disk-usage

Archived and active journals take up 2.7G on disk.

设置日志占用的空间

journalctl --vacuum-size=500M

注意超出部分将被Delete

journalctl --vacuum-size

[root@cloud local]# journalctl --vacuum-size=500M

Vacuuming done, freed 0B of archived journals on disk.

设置日志保存的时间

journalctl --vacuum-time=1month

journalctl --vacuum-time

[root@cloud local]# journalctl --vacuum-time=1month

Deleted archived journal /var/log/journal/2b17394d61974d95b2f8810a81a2dfcb/system@03f61e2080f54516b6dc72d59c364ebd-0000000000000001-0005b81138ce4b57.journal (8.0M).

Vacuuming done, freed 8.0M of archived journals on disk.

---------------------------------------------------------------------------------------------------------------------------------

Systemd详解

Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进 程和其它进程。

systemd所管理的所有系统资源都称作Unit

通过systemd命令集可以方便的对这些Unit进行管理

unit不仅仅包含服务,还有其他类型

unit类型

service :文件扩展名为.service, 用于定义系统服务

target :文件扩展名为.target,用于模拟实现运行级别

device :用于定义内核识别的设备

mount:定义文件系统挂载点

socket:用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动

snapshot :管理系统快照

swap:用于标识swap设备

automount :文件系统的自动挂载点

path:用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,延迟激活服务

systemctl status命令

查看指定Unit状态

systemctl status

[root@cloud ~]# systemctl status httpd.service

● httpd.service - LSB: starts Apache Web Server

Loaded: loaded (/etc/rc.d/init.d/httpd; bad; vendor preset: disabled)

Active: active (running) since Tue 2022-01-04 11:16:52 CST; 3h 22min ago

Docs: man:systemd-sysv-generator(8)

CGroup: /system.slice/httpd.service

├─ 939 /usr/local/apache/bin/httpd -k start

├─1106 /usr/local/apache/bin/httpd -k start

├─1107 /usr/local/apache/bin/httpd -k start

└─1108 /usr/local/apache/bin/httpd -k start

Jan 04 11:16:45 cloud.cn systemd[1]: Starting LSB: starts Apache Web Server....

Jan 04 11:16:52 cloud.cn systemd[1]: Started LSB: starts Apache Web Server.

systemctl list-units命令(systemctl等效)

查看系统中Unit信息

systemctl list-units

systemctl list-units #列出正在运行的Unit

systemctl list-units --all #列出所有Unit,包括缺失配置文件或启动失败的

systemctl list-units --all --state=inactive #列出所有没有运行的Unit

systemctl list-units --failed #列出所有加载失败的Unit

systemctl list-units --type=service #列出所有正在运行的类型为service的Unit

systemctl --failed

列出所有失败的单元

systemctl --failed

[root@jumpserver system]# systemctl --failed

0 loaded units listed. Pass --all to see loaded but inactive units, too.

To show all installed unit files use 'systemctl list-unit-files'.

所有可用的单元文件存放位置:

路径

说明

优先级

/etc/systemd/system

系统或用户提供的配置文件

/run/systemd/system

软件运行时生成的配置文件

/usr/lib/systemd/system

系统或第三方软件安装时添加的配置文件

systemctl list-dependencies

查看Unit依赖关系,比如A依赖于B则代表Systemd在启动A的时候同时会启动 B。

systemctl list-dependencies [unit] //查询这个服务的子服务

systemctl list-dependencies [unit][–reverse] //查询这个服务的上级服务

查询服务上下级服务

[root@cloud ~]# systemctl list-dependencies slices.target

slices.target

● ├─-.slice

● └─system.slice

[root@cloud ~]# systemctl list-dependencies slices.target --reverse

slices.target

● └─basic.target

● ├─atd.service

● ├─cpupower.service

● ├─crond.service

● ├─dbus.service

...........

● ├─initrd.target

● └─multi-user.target

● └─graphical.target

systemctl list-unit-filis

用于列出Unit配置文件与启用状态。

systemctl list-unit-files --type=mount

列出所有系统挂载点

systemctl list-unit-files --type=socket

列出所有可用系统套接口

STATE分为了四种状态:

enabled(已建立开机启动软链接)

disabled(没有建立开机启动)

static(该配置文件没有[Install]部分所以无法启动,只能作为其它Unit的依赖文件)

masked(禁止建立启动软链接文件)

服务的启停

systemctl命令

说明

systemctl start [unit type]

启动服务

systemctl stop [unit type]

停止服务

systemctl restart [unit type]

重启服务

systemctl reload [unit type]

重新加载指定的服务

systemctl daemon-reload

重新加载所有被修改过的服务配置,否则配置不会生效

systemctl kill [unit type]

如果服务无法正常停止则使用kill方式终止

systemctl is-active [unit type]

服务是否正在运行

开机自启动/关闭

systemctl命令

说明

systemctl enable [unit type]

设置服务开机启动

systemctl disable [unit type]

设备服务禁止开机启动

systemctl is-enabled [unit type]

服务是否设置了开机自启动。

注销服务(禁用)

systemctl命令

说明

systemctl mask [unit type]

注销服务。

systemctl unmask [unit type]

取消对服务的注销。

-------------------------------------------------------------------------------------------------------------

unit文件字段详解:

分为三个部分[Unit],[Service],[Install]

sshd.service

[root@jiali system]# cat sshd.service

[Unit]

Description=OpenSSH server daemon

Documentation=man:sshd(8) man:sshd_config(5)

After=network.target sshd-keygen.service

Wants=sshd-keygen.service

[Service]

Type=notify

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

[Install]

WantedBy=multi-user.target

Unit字段详解

Description

描述信息,自定义即可。

Documentation

介绍这个服务的文档的地址,可以是url,也可以是其他地址。

Requires

依赖的其他 Unit 列表,列在其中的 Unit 模块会在这个服务启动的同时被启动,并且如果其中有任意一个服务启动失败,这个服务也会被终止。

Wants

与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模块启动是否成功。

After

与 Requires 相似,但会在后面列出的所有模块全部启动完成以后,才会启动当前的服务。

Before

与 After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。

BindsTo

与 Requires 相似,但是一种更强的关联。启动这个服务时会同时启动列出的所有模块,当有模块启动失败时终止当前服务。反之,只要列出的模块全部启动以后,也会自动启动当前服务。并且这些模块中有任意一个出现意外结束或重启,这个服务会跟着终止或重启。

PartOf

这是一个 BindTo 作用的子集,仅在列出的任何模块失败或重启时,终止或重启当前服务,而不会随列出模块的启动而启动。

OnFailure

当这个模块启动失败时,就自动启动列出的每个模块。

Conflicts

与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。

Service字段详解

Type

Type=simple:默认值,ExecStart字段启动的进程为主进程,服务进程不会 fork,如果该服务要启动其他服务,不要使用此类型启动。

Type=forking:ExecStart字段将以fork()方式从父进程创建子进程启动,创建后父进程会立即退出,子进程成为主进程。通常需要指定PIDFile字段,以便 Systemd 能够跟踪服务的主进程

对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可

Type=oneshot:只执行一次,Systemd 会等当前服务退出,再继续往下执行。适用于只执行一项任务、随后立即退出的服务。通常需要指定RemainAfterExit=yes字段,使得 Systemd 在服务进程退出之后仍然认为服务处于激活状态

Type=dbus:当前服务通过 D-Bus 信号启动。当指定的 BusName 出现在 DBus 系统总线上时,Systemd认为服务就绪

Type=notify:当前服务启动完毕会发出通知信号,通知 Systemd,然后 Systemd 再启动其他服务

Type=idle:Systemd 会等到其他任务都执行完,才会启动该服务。

RemainAfterExit

当前服务的所有进程都退出的时候,Systemd 仍认为该服务是激活状态。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的

ExecStart

启动当前服务的命令

ExecStartPre

启动当前服务之前执行的命令

ExecStartPost

启动当前服务之后执行的命令。

TimeoutStartSec

定义 Systemd 停止当前服务之前等待的秒数。

ExecStop

停止当前服务时执行的命令

ExecStopPost

停止当前服务之后执行的命令

KillMode:定义 Systemd 如何停止服务,可能的值包括:

control-group(默认值):当前控制组里面的所有子进程,都会被杀掉

process:只杀主进程(sshd 服务,推荐值)

mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号

none:没有进程会被杀掉,只是执行服务的 stop 命令。

TimeoutStopSec

停止服务时的等待的秒数,如果超过这个时间服务仍然没有停止,systemd 会使用 SIGKILL 信号强行杀死服务的进程。

Restart

no(默认值):退出后不会重启

on-success:只有正常退出时(退出状态码为0),才会重启

on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启(守护进程,推荐值)

on-abnormal:只有被信号终止和超时,才会重启(对于允许发生错误退出的服务,推荐值)

on-abort:只有在收到没有捕捉到的信号终止时,才会重启

on-watchdog:超时退出,才会重启

always:不管是什么退出原因,总是重启

PIDFile:指向当前服务 PID file 的绝对路径。

RestartSec

Systemd 重启当前服务间隔的秒数

ExecReload

重启当前服务时执行的命令

Environment

为服务添加环境变量,如前面的第一个例子中所示。

EnvironmentFile

指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义。

Nice

服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。

WorkingDirectory

指定服务的工作目录。

RootDirectory

指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。

User

指定运行服务的用户

Group

指定运行服务的用户组

EnvironmentFile:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取

LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等

限制特定服务可用的系统资源量,例如 CPU,程序堆栈,文件句柄数量,子进程数量

Install字段详解

最常见的用法:WantedBy=multi-user.target,表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。

RequiredBy

和[Unit]的 Requires 作用相似,依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入/etc/systemd/system目录下以 target 名 + .required后缀构成的子目录中

Alias:当前 Unit 可用于启动的别名

Also

当这个服务被 enable/disable 时,将自动 enable/disable 后面列出的每个模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值