在Linux中部署长期运行的应用程序
1. 简介
很多时候,我们希望应用程序在启动后继续运行。我们可以考虑使用 cron 作业或脚本,但有一个更简单、更可靠的解决方案systemd 。
systemd是一个初始化工具,它在引导过程之后启动所有 Linux 配置的应用程序和进程。在本教程中,我们将了解如何使我们的应用程序或脚本成为systemd服务。
2. 示例应用
首先,让我们选择一个用于创建服务的应用程序。Python2 提供了一个简单的 HTTP 服务器模块,可以在一行中运行 HTTP Server:
python -m SimpleHTTPServer
我们可以通过在浏览器中导航到http://localhost:8000/ 来检查服务器是否已启动并正在运行。
3. 创建服务
现在我们已经准备好我们的应用程序,我们需要创建一个systemd服务定义文件。让我们在*/etc/systemd/system/simplehttpserver.service*创建一个服务定义文件,内容如下:
[Unit]
Description=Simple Http Server
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=myusr
ExecStart=python -m SimpleHTTPServer
[Install]
WantedBy=multi-user.target
为了配置应用程序运行,我们提供了ExecStart=command指令。此外,我们将使用User=username指令来提供启动服务的用户。
除了上述指令之外,我们还需要配置一些预先指令,以使我们的服务能够适应故障。
我们添加了After指令,因此系统会在启动当前服务之前启动列出的服务。由于我们的服务需要网络服务,根据我们的配置,systemd会在启动我们的服务之前启动它。
由于默认情况下,systemd不会在退出时重新启动服务,因此我们包含了Restart指令,通过将其设置为always来启用此行为。
默认情况下,systemd会在 100 毫秒后尝试重新启动。我们可以通过设置RestartSec指令来指定尝试重新启动之前等待的秒数。
当我们配置Restart=always时,如果在 10 秒的时间间隔内启动超过 5 次,systemd将放弃重启服务。因此,如果我们希望服务自动重启,我们可以使用一些额外的选项:
- 将RestartSec设置为 3 或更多。然后systemd将永远无法在 10 秒的间隔内重新启动 5 次。
- 设置StartLimitIntervalSec=0。此外,建议将RestartSec指令保持为 1 或更大,以避免对服务器造成太大压力。
4. 运行服务
现在我们已经在上一节中将我们的应用程序配置为服务。让我们使用以下命令启动我们的服务:
systemctl start simplehttpserver
要随时检查我们的服务状态,我们可以使用systemctl status命令,如下所示:
systemctl status simplehttpserver
为了使我们的服务在启动时自动启动,我们使用enable参数:
systemctl enable simplehttpserver