Systemd


以下只是我常用的一部分,具体可以查看实战教程

  • Wants字段: 假如你的web程序用到了redis,就可以写上Wants=redis.service,systemd会在redis没有启动的时候帮你启动一次,但Wants只管依赖不管顺序,如果需要在redis启动后再启动web应用,需要加上After=redis.service。因为Wants代表弱依赖,所以当redis启动失败时,web应用仍然会启动。强依赖使用Requires字段,当redis启动失败,web应用也会失败。
  • Type字段: 如果是持续启动的服务,比如一个http服务器,就使用simple,服务启动他会立刻标记状态为active,进程结束就会标记为inactive。如果是一次性命令,使用oneshot,需要配合RemainAfterExit=yes,否则它的状态始终是inactive。当服务启动后,它会等进程结束才会标记为active,这样一些需要在它之后启动的服务(After=服务A),就可以等它执行完再启动。当使用stop命令停止时,会标记为inactive。
  • RemainAfterExit字段: 设置为yes时,即使进程退出,systemd仍然认为它在运行(active状态),默认为no
  • Restart字段: 如果服务端崩溃或意外退出,Systemd 会自动将其重启。always 表示无论何种原因退出都重启;on-failure 表示只有非正常退出(错误码不为 0)时才重启。
  • RestartSec字段: 例如 RestartSec=5,崩溃后等待5秒再执行重启操作,防止死循环无限瞬间重启。
  • User字段: 设置为root代表以root用户身份执行命令,假如你的命令需要访问目录/root,那就需要设置为root
  • WorkingDirectory字段: 指定服务运行的“当前工作目录”。相当于在执行启动命令前,先 cd 到这个目录。
  • WantedBy字段: 使用systemctl enable命令启动这个服务时,假如你设置的是multi-user.target,它会在/etc/systemd/system/multi-user.target.wants/目录下创建一个指向这个服务的软链接,systemd会在开机启动multi-user.target时顺便启动这个文件夹下的服务。
    • multi-user.target:(最常用)多用户命令行模式。
    • graphical.target:图形用户界面模式。如果你的服务依赖于桌面环境(比如某个 GUI 托盘程序),应该设置为这个。
    • default.target:系统的默认目标(通常是指向上述两者之一的软链接)。
    • bluetooth.target:当系统检测到蓝牙适配器可用时激活。适合蓝牙相关的守护进程。
    • printer.target:当连接了打印机时激活。
    • smartcard.target:当检测到智能卡读卡器时激活。
    • sound.target:声卡设备就绪时激活。
  • 例子:
[Unit]
Description=Caddy Simple File Server
After=network.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/caddy file-server --listen :39004 --root /root/资源 --browse

[Install]
WantedBy=multi-user.target