首先提供一个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 后面列出的每个模块。 |