systemd

https://www.freedesktop.org/wiki/Software/systemd/

systemd

# 列出docker 依赖发服务
[root@tencent-sh ~]# systemctl list-dependencies docker
docker.service
● ├─containerd.service
● ├─docker.socket
● ├─system.slice
● ├─basic.target
● │ ├─rhel-dmesg.service
● │ ├─selinux-policy-migrate-local-changes@targeted.service
● │ ├─paths.target
● │ ├─slices.target
● │ │ ├─-.slice
● │ │ └─system.slice
● │ ├─sockets.target
● │ │ ├─dbus.socket
● │ │ ├─dm-event.socket
● │ │ ├─iscsid.socket
● │ │ ├─iscsiuio.socket
● │ │ ├─sharpd.socket
● │ │ ├─systemd-initctl.socket
● │ │ ├─systemd-journald.socket
● │ │ ├─systemd-shutdownd.socket
● │ │ ├─systemd-udevd-control.socket
● │ │ └─systemd-udevd-kernel.socket
● │ ├─sysinit.target
● │ │ ├─dev-hugepages.mount
● │ │ ├─dev-mqueue.mount
● │ │ ├─iscsi.service
● │ │ ├─kmod-static-nodes.service
● │ │ ├─lvm2-lvmetad.socket
● │ │ ├─lvm2-lvmpolld.socket
● │ │ ├─lvm2-monitor.service
● │ │ ├─openibd.service
● │ │ ├─plymouth-read-write.service
● │ │ ├─plymouth-start.service
● │ │ ├─proc-sys-fs-binfmt_misc.automount
● │ │ ├─rhel-autorelabel.service
● │ │ ├─rhel-domainname.service
● │ │ ├─rhel-import-state.service
● │ │ ├─rhel-loadmodules.service
● │ │ ├─sys-fs-fuse-connections.mount
● │ │ ├─sys-kernel-config.mount
● │ │ ├─sys-kernel-debug.mount
● │ │ ├─systemd-ask-password-console.path
● │ │ ├─systemd-binfmt.service
● │ │ ├─systemd-firstboot.service
● │ │ ├─systemd-hwdb-update.service
● │ │ ├─systemd-journal-catalog-update.service
● │ │ ├─systemd-journal-flush.service
● │ │ ├─systemd-journald.service
● │ │ ├─systemd-machine-id-commit.service
● │ │ ├─systemd-modules-load.service
● │ │ ├─systemd-random-seed.service
● │ │ ├─systemd-sysctl.service
● │ │ ├─systemd-tmpfiles-setup-dev.service
● │ │ ├─systemd-tmpfiles-setup.service
● │ │ ├─systemd-udev-trigger.service
● │ │ ├─systemd-udevd.service
● │ │ ├─systemd-update-done.service
● │ │ ├─systemd-update-utmp.service
● │ │ ├─systemd-vconsole-setup.service
● │ │ ├─cryptsetup.target
● │ │ ├─local-fs.target
● │ │ │ ├─-.mount
● │ │ │ ├─rhel-readonly.service
● │ │ │ ├─systemd-fsck-root.service
● │ │ │ └─systemd-remount-fs.service
● │ │ └─swap.target
● │ └─timers.target
● │   └─systemd-tmpfiles-clean.timer
● └─network-online.targe

概念:

Socket Unit:进程间通信的 socket
Service Unit:系统服务
Target Unit:多个 Unit 构成的一个组

启动文件结构

配置文件位置 /usr/lib/systemd/system

[Unit]
[Service]
[Install]

第一部分 [Unit]

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service containerd.service  # 要求当前服务在他们之后启动
Wants=network-online.target   # 配合当前unit启动,如果network-online.target失败不会影响当前服务启动
Requires=docker.socket containerd.service # 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前Unit会启动失败

第二部分 [Service]

[Service]
Type=notify  # 当前服务启动完毕,会通知Systemd,再继续往下执行
EnvironmentFile=/run/flannel/subnet.env   # 文件是key=value的变量组成,可以在启动命令中通过 $key 的方式引用变量
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock  启动当前服务的命令
ExecReload=/bin/kill -s HUP $MAINPID 重启当前服务时执行的命令
TimeoutSec=0		定义 Systemd 停止当前服务之前等待的秒数
RestartSec=2		自动重启当前服务间隔的秒数
Restart=always	定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

第三部分 [Install]

[Install]
WantedBy=multi-user.target

测试事例

[root@test ~]# cat >>/run/flannel/subnet.env<<EOF
FLANNEL_NETWORK=172.7.0.0/16
FLANNEL_SUBNET=172.7.21.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=false
EOF

修改启动文件

EnvironmentFile=/run/flannel/subnet.env   # 文件不存在是会报错
ExecStart=/usr/bin/dockerd \
          -H fd:// --containerd=/run/containerd/containerd.sock \
          --bip ${FLANNEL_SUBNET} \
          --mtu=${FLANNEL_MTU}

修改/新建配置文件后使用 systemctl daemon-reload 加载配置文件
使用systemctl 管理的应用可以使用 journalctl -u flanneld 查看日志

posted @ 2021-12-18 21:05  mingtian是吧  阅读(109)  评论(0编辑  收藏  举报