1. 创建 systemd 服务文件在 /etc/systemd/system/ 目录下创建 .service 文件例如 myservice.service2. 重新加载 systemd 配置创建或修改服务文件后需要执行以下命令让 systemd 识别新服务sudo systemctl daemon-reload3. 启用服务开机自启使用 systemctl enable 命令将服务添加到启动项sudo systemctl enable myservice.service这会在 /etc/systemd/system/multi-user.target.wants/ 目录下创建符号链接确保服务在系统启动时自动运行 。myservice.service 例子[Unit]DescriptionfloodAfternetwork.target[Service]Typesimple# 当前的用户名Userroot# 开机自启动脚本start_one.shExecStart/usr/local/bin/flood.shPrivateTmptrueKillModecontrol-group[Install]WantedBymulti-user.targetflood.sh 脚本#!/bin/bashsource /opt/ros/noetic/setup.bashsource /root/FloodInspect/devel/setup.bashroslaunch inspect_rgv inspect_rgv.launchserver 配置文件详解每一个 Unit 都有一个配置文件告诉 Systemd 怎么启动这个 Unit 。Systemd 默认从目录/etc/systemd/system/读取配置文件。但是里面存放的大部分文件都是符号链接指向目录/usr/lib/systemd/system/真正的配置文件存放在那个目录。systemctl enable命令用于在上面两个目录之间建立符号链接关系。开机时Systemd只执行/etc/systemd/system目录里面的配置文件。service文件定义了一个服务分为[Unit][Service][Install]三个小节如下[Unit] Description:描述 After在network.target,auditd.service启动后才启动 ConditionPathExists: 执行条件 [Service] EnvironmentFile:变量所在文件 ExecStart: 执行启动脚本 Restart: fail时重启 [Install] Alias:服务别名 WangtedBy: 多用户模式下需要的配置文件的区块[Unit]区块通常是配置文件的第一个区块用来定义 Unit 的元数据以及配置与其他 Unit 的关系。它的主要字段如下。Description简短描述 Documentation文档地址 Requires当前 Unit 依赖的其他 Unit如果它们没有运行当前 Unit 会启动失败 Wants与当前 Unit 配合的其他 Unit如果它们没有运行当前 Unit 不会启动失败 BindsTo与Requires类似它指定的 Unit 如果退出会导致当前 Unit 停止运行 Before如果该字段指定的 Unit 也要启动那么必须在当前 Unit 之后启动 After如果该字段指定的 Unit 也要启动那么必须在当前 Unit 之前启动 Conflicts这里指定的 Unit 不能与当前 Unit 同时运行 Condition...当前 Unit 运行必须满足的条件否则不会运行 Assert...当前 Unit 运行必须满足的条件否则会报启动失败[Install]通常是配置文件的最后一个区块用来定义如何启动以及是否开机启动。它的主要字段如下。WantedBy它的值是一个或多个 Target当前 Unit 激活时enable符号链接会放入/etc/systemd/system目录下面以 Target 名 .wants后缀构成的子目录中 RequiredBy它的值是一个或多个 Target当前 Unit 激活时符号链接会放入/etc/systemd/system目录下面以 Target 名 .required后缀构成的子目录中 Alias当前 Unit 可用于启动的别名 Also当前 Unit 激活enable时会被同时激活的其他 Unit[Service]区块用来 Service 的配置只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。Type定义启动时的进程行为。它有以下几种值。 Typesimple默认值执行ExecStart指定的命令启动主进程 Typeforking以 fork 方式从父进程创建子进程创建后父进程会立即退出 Typeoneshot一次性进程Systemd 会等当前服务退出再继续往下执行 Typedbus当前服务通过D-Bus启动 Typenotify当前服务启动完毕会通知Systemd再继续往下执行 Typeidle若有其他任务执行完毕当前服务才会运行 ExecStart启动当前服务的命令 ExecStartPre启动当前服务之前执行的命令 ExecStartPost启动当前服务之后执行的命令 ExecReload重启当前服务时执行的命令 ExecStop停止当前服务时执行的命令 ExecStopPost停止当其服务之后执行的命令 RestartSec自动重启当前服务间隔的秒数 Restart定义何种情况 Systemd 会自动重启当前服务可能的值包括always总是重启、on-success、on-failure、on-abnormal、on-abort、on-watchdog TimeoutSec定义 Systemd 停止当前服务之前等待的秒数 Environment指定环境变量修改配置文件后重启修改配置文件以后需要重新加载配置文件然后重新启动相关服务。# 重新加载配置文件 $ sudo systemctl daemon-reload # 重启相关服务 $ sudo systemctl restart foobar服务管理systemctl start 服务名 开启服务 systemctl stop 服务名 关闭服务 systemctl status 服务名 显示状态 systemctl restart 服务名 重启服务 systemctl enable 服务名 开机启动服务 systemctl disable 服务名 禁止开机启动 systemctl list-units 查看系统中所有正在运行的服务 systemctl list-unit-files 查看系统中所有服务的开机启动状态 systemctl list-dependencies 服务名 查看系统中服务的依赖关系 systemctl mask 服务名 冻结服务 systemctl unmask 服务名 解冻服务 systemctl set-default multi-user.target 开机时不启动图形界面 systemctl set-default graphical.target 开机时启动图形界面 修改服务配置文件后需要 systemctl daemon-reload 设置服务开机自启动 systemctl enable postgresql.service 查询是否自启动服务 systemctl is-enabled postgresql.service 取消服务器开机自启动 systemctl disable postgresql.service # 显示某个 Unit 是否正在运行 $ systemctl is-active application.service # 显示某个 Unit 是否处于启动失败状态 $ systemctl is-failed application.service # 显示某个 Unit 服务是否建立了启动链接 $ systemctl is-enabled application.service #显示某个unit 服务日志 journalctl -u auto_start.service -f