Contents

在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