Linux 创建 systemd 服务

在现代 Linux 系统中,服务的自启动与管理通常由 systemd 负责。本文介绍如何创建自定义的 systemd 服务,并通过 systemctl 对其进行启动、停止、重启和状态查看。

1. systemd 服务文件的位置

Linux 下有两个常见的服务目录:

  • /lib/systemd/system:系统自带服务目录
  • /etc/systemd/system:自定义服务目录,通常用于存放用户自己编写的服务文件

一般情况下,自定义服务应放在 /etc/systemd/system,这样可以和系统内置服务分开管理。

2. 创建一个自定义服务

下面以 Redis 服务为例,演示如何创建一个 systemd 服务文件。

1
sudo vim /etc/systemd/system/redis.service

服务文件内容示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=redis server
After=network.target remote-fs.target nss-lookup.target

[Service]
User=root
Type=forking
WorkingDirectory=/usr/local/redis
PIDFile=/usr/local/redis/redis.pid
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

配置项说明

  • Description:服务描述
  • After:表示该服务依赖哪些目标在前启动
  • User:服务运行用户
  • Type=forking:说明服务会在后台创建子进程并退出主进程
  • WorkingDirectory:服务工作目录
  • PIDFile:进程 ID 文件
  • ExecStart:服务启动命令
  • ExecReload:重载命令
  • ExecStop:停止命令
  • PrivateTmp=true:隔离临时目录
  • WantedBy=multi-user.target:表示在多用户模式下启用该服务

3. 重新加载 systemd 配置

创建或修改服务文件后,需要重新加载 systemd 的配置列表:

1
sudo systemctl daemon-reload

4. 管理服务

启动服务

1
sudo systemctl start redis.service

停止服务

1
sudo systemctl stop redis.service

重启服务

1
sudo systemctl restart redis.service

查看状态

1
sudo systemctl status redis.service

开机自启

1
sudo systemctl enable redis.service

取消开机自启

1
sudo systemctl disable redis.service

5. 以 nginx 为例的常见写法

如果你想创建一个 Nginx 服务,通常可以按如下方式写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=nginx service
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

然后执行:

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable nginx.service
sudo systemctl start nginx.service

6. 常见问题与排查

1)服务启动失败

可以先查看日志或状态:

1
2
sudo systemctl status redis.service
sudo journalctl -u redis.service -n 50

2)服务一直处于 activatingfailed 状态

检查以下几点:

  • ExecStart 路径是否正确
  • WorkingDirectory 是否存在
  • PIDFile 是否能正确生成
  • 服务依赖的配置文件是否存在

3)服务没有开机自启

确认是否执行了:

1
sudo systemctl enable redis.service

并检查是否在正确的目标下启用。

7. 实用建议

在实际运维中,建议:

  • 将自定义服务统一放置在 /etc/systemd/system
  • systemctl statusjournalctl 进行排查
  • 服务启动命令尽量写成绝对路径
  • 如果服务依赖数据库、网络或挂载点,确保 After 配置合理

8. 总结

systemd 服务的创建本质上就是编写一个规范的服务描述文件,然后通过以下命令完成管理:

1
2
3
4
sudo systemctl daemon-reload
sudo systemctl enable service-name.service
sudo systemctl start service-name.service
sudo systemctl status service-name.service

掌握 systemd 服务管理方法后,就可以方便地把应用程序托管为系统服务,实现开机自启和稳定管理。


Linux 创建 systemd 服务
https://jgq12138.github.io/2023/06/19/linux_create_service/
作者
JGQ12138
发布于
2023年6月19日
许可协议