target
target就是一堆Service的集合,它本身不是service,但是他关联了很多service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 众所周知,系统运行等级3是多租户模式 systemctl get-default multi-user.target
systemctl list-dependencies multi-user.target multi-user.target ● ├─aegis.service ● ├─aliyun.service .... ● ├─var-lib-snapd-snap-snapd-23771.mount ● ├─basic.target ● │ ├─microcode.service
从这个图中可以看出,它除了依赖service,还依赖basic.target
除此之外,系统会加载/etc/systemd/system/multi-user.target.wants 这个目录下都是一些软链接 是multi-user.target它希望运行的一些service
|
Service配置文件解析
以sshd服务为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| cat /usr/lib/systemd/system/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]部分——定义Unit的元数据
1 2 3 4 5 6 7 8 9 10
| Description: 描述 Documentation: 文档地址 Requires: (硬性)依赖关系——当前Unit依赖的其他Unit Wants: (软性)配合关系——当前Unit配合的其他Unit BindsTo: 共生关系——如果指定Unit退出,当前Unit也会退出 Before: 顺序关系——指定的Unit必须在当前Unit启动后启动 After: 顺序关系——指定的Unit必须在当前Unit启动前启动 Conflicts: 冲突关系——不能和当前Unit同时运行 Condition: 条件关系——当前Unit运行需要满足的条件 Assert: 条件关系——当前Unit运行需要满足的条件
|
[Service]部分——表示Unit的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| Type: 定义Service启动时的进程行为( 其选项包括: Type-simple: 默认值,执行ExecStart命令,启动主进程 Type-forking: 从父进程创建子进程,创建后父进程会退出,需要指定PIDFile。如mysql,redis,httpd Type-notify: 当服务启动完毕,通知systemd继续往下执行——作为系统启动流程的一部分 Type-oneshot: 一次性进程,Systemd会等待服务退出再继续执行 Type-dbus: 通过D-bus启动 Type-idle: 其他任务执行完毕时,当前服务才会运行 )
ExecStart: 启动服务的命令 ExecStartPre: 启动服务之前运行的命令 ExecStartPost: 启动服务之后运行的命令 ExecReload: 重启服务时执行的命令(kill -hup) ExecStop: 服务停止时执行的命令 ExecStopPost: 停止服务后执行的命令 Restart: 自动重启的策略:( always 总是重启 on-success 只有成功了才自动重启 on-failure 只有失败了才自动重启 等) RestartSec: 自动重启时,间隔的秒数 TimeoutSec: 停止服务前等待的秒数 Environment: 定义变量
|
[Install]部分——定义如何启动服务
1 2 3 4
| WantedBy: 和target联系起来,会将当前Unit放入到目标target的wants目录中,使其开机自启 RequiredBy: 和target联系起来,会将当前Unit放入到目标target的required目录中,使其开机自启 Alias: 当前Unit用于启动的别名 Also: 依赖关系-同时激活其他Unit
|
自定义一个Service文件
比如我现在要在启动系统时就启动一个脚本,并且让它重复不断运行,这个脚本叫k8s-check.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| vim /usr/lib/systemd/system/k8s-check.service [Unit] Description: This is a k8s cluster check scrpit
[Service] ExecStart=/root/k8s-check.sh --all -n prod --kubeconfig /root/config_aliyun Restart=always RestartSec=60
[Install] WantedBy=multi-user.target
systemctl daemon-reload systemctl enable k8s-check.service --now
|