systemctl 编写启动脚本
在/usr/lib/systemd目录下包含了各种unit文件,有service后缀的服务unit,有target后缀的开机级别unit等,这里介绍关于service后缀的文件。因为systemd在开机要想执行自启动,都是通过这些*.service 的unit控制的,
服务又分为系统服务(system)和用户服务(user)。
系统服务:开机不登陆就能运行的程序(常用于开机自启)在/usr/lib/systemd/system目录下
用户服务:需要登陆以后才能运行的程序。
查看配置文件
systemctl cat nginx.service
配置文件详解
[Unit]
| After | 表示服务需要在***服务之后执行 |
| Before | 表示服务需要在***服务之前执行 |
| Wants | 弱依赖关系 |
| Requires | 强依赖关系 ***服务停止之后本服务也必须停止 |
[Service]
| EnvironmentFile | 环境参数 |
| ExecStart | 程序进程执行时的命令 |
| ExecReload | 重启服务时执行的命令 |
| ExecStop | 停止服务时执行的命令 |
| ExecStartPre | 启动服务之前执行的命令 |
| ExecStartPost | 启动服务之后执行的命令 |
| ExecStopPost | 停止服务之后执行的命令 |
所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等号后面的那个连词号),就表示即使/etc/sysconfig/sshd文件不存在,也不会抛出错误
Type段
| simple(默认) | ExecStart字段启动的进程为主进程 |
| forking | ExecStart以fork()方式进行启动,此时父进程将会推出,子进程将成为主进程 |
| oneshot | 类似于simple,但只执行一次,Systemd会等它执行完,才启动其他服务 |
| dbus | 类似于simple,但会等待D-Bus信号后启动 |
| notify | 类似于simple,启动结束后会发出通知信号,然后Systemd再启动其他服务 |
| dle |
类似于simple,但是要等到其他任务都执行完,才会启动该服务。 |
KillMode字段
| control-group(默认) | 当前控制组里面的所有子进程,都会被杀掉 |
| porcess | 只杀主进程 |
| mixed | 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号 |
| none | 没有进程会被杀掉,只是执行服务的 stop 命令 |
Restart字段
| no(默认值) | 退出后不会重启 |
| on-success | 只有正常退出时(退出状态码为0),才会重启 |
| on-failure | 非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启 |
| on-abnormal | 只有被信号终止和超时,才会重启 |
| on-abort | 只有在收到没有捕捉到的信号终止时,才会重启 |
| on-watchdog | 超时退出才会重启 |
[Install]
Install区块,定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
常用的 Target 有两个:
multi-user.target:表示多用户命令行状态
graphical.target:表示图形用户状态
示例 docker.service
[Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.com After=network.target Wants=docker-storage-setup.service Requires=docker-cleanup.timer [Service] Type=notify NotifyAccess=main EnvironmentFile=-/run/containers/registries.conf EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network Environment=GOTRACEBACK=crash Environment=DOCKER_HTTP_HOST_COMPAT=1 Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin ExecStart=/usr/bin/dockerd-current \ --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \ --default-runtime=docker-runc \ --exec-opt native.cgroupdriver=systemd \ --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \ --init-path=/usr/libexec/docker/docker-init-current \ --seccomp-profile=/etc/docker/seccomp.json \ $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ $BLOCK_REGISTRY \ $INSECURE_REGISTRY \ $REGISTRIES ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity TimeoutStartSec=0 Restart=on-abnormal KillMode=process [Install] WantedBy=multi-user.target

浙公网安备 33010602011771号