linux systemd 是什么

systemd是Linux系统中一个初始化系统和服务管理器,用于引导用户空间并管理各种进程。 替代了传统的SysVinit,提供更快的启动速度,并行启动,按需启动。

如何使用 systemd

启动服务

  sudo systemctl start servicename.service

停止服务

  sudo systemctl stop servicename.service

重启服务

  sudo systemctl restart servicename.service

开机启动

  sudo systemctl enable servicename.service

取消开机启动

  sudo systemctl enable servicename.service

查看服务状态

 sudo systemctl status servicename.service

服务状态

  • active(running) - 服务正在运行
  • active(exited) - 服务已成功完成一次性任务(适用于单次运行的服务)。
  • active(waiting) - 服务已启动,但正在等待某个事件(如 socket 激活的服务)。
  • inactive(dead) - 服务未运行或已停止。
  • activating - 服务正在启动过程中。
  • deactivating - 服务正在停止过程中。
  • failed - 服务启动失败,可能是配置错误或依赖问题。

服务的启动状态

  • enabled - 服务已设置为开机自启
  • disabled - 服务未设置为开机自启
  • static - 服务不能直接启用,但可能被其他服务依赖
  • masked - 服务被屏蔽,无法启动或启用(通常通过 systemctl mask 设置)

创建自定义服务

在/etc/systemd/system/下创建服务文件

[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/usr/local/bin/mycustomscript.sh
Restart=on-failure
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target

服务文件包含三个部分:Unit,Service,Install

  • Unit

    • Description:服务的描述信息
    • After:定义服务的启动顺序。例如,After=network.target 表示在网络服务启动后再启动此服务
    • Requires:定义服务的依赖关系。如果依赖的服务失败,此服务也不会启动。
    • Wants:定义服务的软依赖关系。即使依赖的服务失败,此服务仍会启动。
  • Service

    • ExecStart - 指定服务启动时执行的命令或脚本
    • ExecStop - 指定服务停止时执行的命令(可选)
    • Restart - 定义服务失败时的重启策略
      • no - 不重启
      • on-faulure - 仅在失败时重启
      • always - 总是重启
      • on-abort - 在意外终止时重启
    • User&Group - 指定运行服务的用户和组
    • WorkingDirectory - 指定服务的工作目录
    • Environment - 设置环境变量
  • Install

    • WantedBy - 定义服务的启动目标
    • RequiredBy - 定义服务的硬依赖目标

创建和修改服务文件后,需要重载systemd配置

sudo systemctl daemon-reload

常用的服务配置

nginx

[Unit]
Description=A high performance web server and a reverse proxy server (Custom Nginx)
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
Restart=on-failure
User=www-data
Group=www-data

[Install]
WantedBy=multi-user.target

redis

[Unit]
Description=Redis In-Memory Data Store (Custom Redis)
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/local/bin/redis-cli shutdown
Restart=on-failure
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

注意设置daemonize no,因为systemd会管理进程

mysql

[Unit]
Description=MySQL Community Server (Custom MySQL)
After=network.target

[Service]
Type=notify
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
ExecStop=/usr/bin/mysqladmin shutdown
Restart=on-failure
User=mysql
Group=mysql

[Install]
WantedBy=multi-user.target

spring-boot

[Unit]
Description=My Spring Boot Application
After=syslog.target network.target

[Service]
User=myappuser
Group=myappgroup
ExecStart=/usr/bin/java -jar /opt/myapp/myapp.jar
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
Environment="SPRING_PROFILES_ACTIVE=prod"

[Install]
WantedBy=multi-user.target

注意创建用户和用户组,不要使用root运行

sudo groupadd myappgroup
sudo useradd -r -g myappgroup myappuser

dotnet

[Unit]
Description=My .NET Application
After=network.target

[Service]
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/dotnet /opt/myapp/myapp.dll
Restart=always
RestartSec=10
User=myappuser
Group=myappgroup
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp

[Install]
WantedBy=multi-user.target

总结

systemd是比传统方式更好的进程管理方式,通过配置文件和一系列命令来管理进程。 需要使用root账号创建配置文件,但是运行程序的时候最好不要以root运行,因为root具有最高权限,如果程序被利用,将会使系统受到破坏。