答案是创建systemd单元文件以管理服务。首先编写.service文件定义服务的启动、用户权限、日志输出等行为,将其置于/etc/systemd/system/目录,使用systemctl命令加载、启动并启用开机自启;通过systemctl status和journalctl -u排查启动失败问题,检查ExecStart路径、权限、用户存在性及依赖关系;安全实践包括使用非特权用户、限制文件系统访问、网络、资源和能力,遵循最小权限原则,提升服务隔离性与系统安全性。

在Linux中编写服务,尤其是在现代发行版中,核心就是创建并配置一个systemd单元文件。这个文件本质上告诉systemd你的程序如何启动、停止、重启,以及在系统启动时如何管理它。它提供了一种标准化且强大的方式来定义系统进程的行为。
编写一个systemd单元文件来定义你的服务,通常是一个
.service
首先,假设你有一个名为
my_script.py
#!/usr/bin/env python3
import time
import datetime
import sys
def run_service():
while True:
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"[{timestamp}] My service is running...", file=sys.stderr) # Output to stderr so journalctl captures it easily
sys.stderr.flush()
time.sleep(5)
if __name__ == "__main__":
run_service()将这个脚本保存到
/opt/my-service/my_script.py
sudo mkdir -p /opt/my-service
sudo mv my_script.py /opt/my-service/
sudo chmod +x /opt/my-service/my_script.py
接下来,你需要创建一个systemd单元文件。通常,这些文件放在
/etc/systemd/system/
my-awesome-app.service
# /etc/systemd/system/my-awesome-app.service [Unit] Description=My Awesome Python Service After=network.target # 确保网络服务启动后才尝试启动此服务 [Service] ExecStart=/usr/bin/python3 /opt/my-service/my_script.py # 你的服务启动命令,请使用绝对路径 WorkingDirectory=/opt/my-service/ # 服务运行的工作目录 User=nobody # 推荐使用非特权用户运行服务,例如nobody或专门创建的用户 Group=nogroup # 同上 Restart=on-failure # 当服务失败时(例如程序退出码非0),systemd会自动重启它 StandardOutput=journal # 将标准输出重定向到journald日志系统 StandardError=journal # 将标准错误重定向到journald日志系统 [Install] WantedBy=multi-user.target # 表示此服务应该在多用户模式下被启动
文件内容解析:
[Unit]
Description
After=network.target
network.target
[Service]
ExecStart
PATH
WorkingDirectory
User
Group
nobody
root
Restart=on-failure
always
no
StandardOutput
StandardError
journald
journalctl
[Install]
WantedBy=multi-user.target
启用和管理服务:
sudo systemctl daemon-reload
sudo systemctl start my-awesome-app.service
sudo systemctl status my-awesome-app.service
sudo systemctl enable my-awesome-app.service
/etc/systemd/system/multi-user.target.wants/
sudo systemctl stop my-awesome-app.service
sudo systemctl disable my-awesome-app.service
通过这种方式,你的应用程序就变成了一个由systemd管理、具有良好行为的系统服务。
当一个systemd服务拒绝启动时,那种挫败感确实让人头疼。我记得有一次,我花了好几个小时才发现只是
ExecStart
立即检查服务状态:systemctl status <service_name>
深入查看日志:journalctl -u <service_name> -e
systemctl status
journalctl
journalctl -u <service_name>
journalctl -u <service_name> -e
journalctl -u <service_name> -f
验证单元文件语法:systemd-analyze verify <unit_file_path>
systemd-analyze verify /etc/systemd/system/my-awesome-app.service
检查ExecStart
ExecStart
PATH
chmod +x /path/to/your/script.sh
User=
Group=
ExecStart
WorkingDirectory
ExecStart
sudo -u <user> /path/to/your/command
检查依赖关系:After=
Requires=
network.target
Requires=
After=
环境和工作目录:Environment=
WorkingDirectory=
[Service]
Environment=
WorkingDirectory
手动运行服务命令: 最直接的调试方法之一是,复制
ExecStart
User=
sudo -u <user_specified_in_service> bash -c "/path/to/your/command --with-args"
记住,调试是一个迭代的过程。每次修改后,都要
sudo systemctl daemon-reload
安全性在任何服务部署中都是至关重要的,systemd提供了很多机制来帮助你沙箱化你的服务,限制其潜在的破坏力。我个人觉得,这些安全配置一开始看起来有点多余,但一旦你遇到过权限滥用导致的问题,就会觉得它们是多么宝贵。
最小权限原则(Principle of Least Privilege):
User=
Group=
root
my-app
my-app
my-app
User=my-app Group=my-app
限制文件系统访问: Systemd允许你精细地控制服务可以访问的文件系统区域。
ReadOnlyPaths=
ReadWritePaths=
InaccessiblePaths=
ReadOnlyPaths=/etc/my-app/config
ReadWritePaths=/var/log/my-app /var/lib/my-app
InaccessiblePaths=/home /srv
ProtectSystem=full
strict
full
/usr
/boot
strict
/etc
full
ProtectHome=true
/home
/root
PrivateTmp=true
/tmp
/var/tmp
限制网络访问:
RestrictAddressFamilies=AF_UNIX AF_INET
IPAddressAllow=
IPAddressDeny=
资源限制: 防止服务耗尽系统资源,影响其他服务或导致系统不稳定。
MemoryLimit=
500M
CPUShares=
LimitNOFILE=
LimitNPROC=
能力(Capabilities)限制: Linux Capabilities允许将root用户的特权细分为更小的、独立的单元。
CapabilityBoundingSet=
CAP_NET_BIND_SERVICE
NoNewPrivileges=true
setuid
setgid
PrivateDevices=true
/dev
一个更安全的[Service]
[Service] ExecStart=/usr/bin/python3 /opt/my-service/my_script.py WorkingDirectory=/opt/my-service/ User=my-app Group=my-app # 文件系统隔离 ProtectSystem=full ProtectHome=true
以上就是如何在Linux中编写服务 Linux systemd单元文件的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号