使用 systemd 创建 Linux 服务
在编写 Web 应用程序时,我经常需要将计算繁重的任务卸载到异步工作脚本,为以后安排任务,甚至编写一个监听套接字以直接与客户端通信的守护程序。
虽然有时可能会有更好的工具来完成这项工作——总是考虑先使用现有的软件,例如任务队列服务器——编写自己的服务可以为你提供一定程度的灵活性,当受第三方约束时你永远无法获得 软件。
很酷的是,创建 Linux 服务相当容易:使用我们最喜欢的编程语言编写一个长时间运行的程序,然后使用 systemd
将其转换为服务。
程序
让我们使用 PHP 创建一个小型服务。 我可以看到你的眉毛在上升,但效果出奇的好。 我们将监听 UDP 端口 10000,并返回通过 ROT13 转换收到的任何消息:
<?php
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($sock, '0.0.0.0', 10000);
echo "server started\n";
for (;;) {
socket_recvfrom($sock, $message, 1024, 0, $ip, $port);
$reply = str_rot13($message);
socket_sendto($sock, $reply, strlen($reply), 0, $ip, $port);
}
下面让我们启动它
$ php server.php
并在另一个终端测试它:
$ nc -u 127.0.0.1 10000
Hello, world!
Uryyb, jbeyq!
酷,它的工作原理。 现在我们希望这个脚本一直运行,在失败的情况下重新启动(意外退出),甚至在服务器重新启动时仍然存在。 这就是 systemd
发挥作用的地方。
把它变成一种服务
让我们创建一个名为 /etc/systemd/system/rot13.service
的文件
[Unit]
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=/usr/bin/env php /path/to/server.php
[Install]
WantedBy=multi-user.target
我们需要:
-
在
User=
之后设置您的实际用户名 -
在
ExecStart=
中设置脚本的正确路径
而已。 我们现在可以启动服务了:
$ systemctl start rot13
并自动让它在启动时启动:
$ systemctl enable rot13
深入理解
既然我们的服务(希望)可以正常工作,那么深入了解配置选项并确保它始终按期望的那样工作可能很重要。
以正确的顺序开始
我们可能想知道 After=
指令做了什么。 它只是意味着我们的服务必须在网络准备好后启动。 如果程序希望 MySQL 服务器启动并运行,应该添加:
After=mysqld.service
退出时重新启动
默认情况下,如果程序因任何原因退出,systemd
不会重新启动服务。 对于必须始终可用的服务,这通常不是我们想要的,因此我们指示它始终在退出时重新启动:
Restart=always
如果退出状态不为 0,我们也可以使用 on-failure
仅重新启动。
默认情况下,systemd
会在 100 毫秒后尝试重新启动。 我们可以使用以下方法指定尝试重新启动之前要等待的秒数:
RestartSec=1
避免陷阱:start 限制
我个人不止一次陷入这种情况。 默认情况下,当像我们一样配置 Restart=always
时,如果它在 10 秒的时间间隔内启动超过 5 次,systemd 将放弃重新启动我们的服务。 永远。
有两个 [Unit]
配置选项负责:
StartLimitBurst=5
StartLimitIntervalSec=10
RestartSec
指令对结果也有影响:如果将其设置为 3 秒后重新启动,那么我们永远无法在 10 秒内达到 5 次失败重试。
始终有效的简单修复方法是设置 StartLimitIntervalSec=0
。 这样,systemd 将尝试永远重启我们的服务。
不过,最好将 RestartSec
设置为至少 1 秒,以避免在出现问题时给服务器造成太大压力。
作为替代方案,我们可以保留默认设置,并在达到启动限制时要求 systemd
重新启动服务器,使用 StartLimitAction=reboot
。
真的是这样吗?
这就是使用 systemd
创建 Linux 服务所需要的全部内容:编写一个引用我们的长时间运行程序的小配置文件。
Systemd 多年来一直是 RHEL/CentOS、Fedora、Ubuntu、Debian 和其他系统中的默认初始化系统,因此我们的服务器很可能已准备好托管自制服务!
相关文章
在 Linux 中安装 MySQL 客户端
发布时间:2023/05/09 浏览次数:72 分类:MySQL
-
在 Linux 中安装 MySQL 客户端的命令。Linux 和 Unix 等环境作为命令行界面工作,仅在命令的帮助下运行。
在 Linux 中更新 YUM
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
本文介绍了 Linux 中的 yum update 命令。本文将教我们如何在 Linux 中更新 YUM,以及如何在 Linux 系统上安装、更新、删除、查找和管理包。
在 Linux 中安装 Deb 文件
发布时间:2023/05/04 浏览次数:130 分类:操作系统
-
本文介绍如何在 Linux 中安装 deb 文件。在这篇 Linux 文章中,我们将学习如何在 Linux 系统上安装 .deb(Debian 软件包)文件。 我们还将看到如何在安装后删除 .deb 文件。
Linux 中的 lsof 命令
发布时间:2023/05/04 浏览次数:82 分类:操作系统
-
在这篇 Linux 文章中,我们将了解 Linux 操作系统中的 lsof 命令。 我们将看到如何在 Linux 中将此命令用于不同目的。
Linux 解决不能执行二进制文件问题
发布时间:2023/05/04 浏览次数:187 分类:操作系统
-
在本文中,我们将学习如何在 Linux 中执行二进制文件。 如果 Linux 无法执行二进制文件,我们还将学习如何解决错误。
Linux 中错误 Mesg: Ttyname Failed: Inappropriate Ioctl for Device Error
发布时间:2023/05/04 浏览次数:145 分类:操作系统
-
本文介绍如何在 Linux 中解决 mesg: ttyname failed: inappropriate ioctl for device 错误。在 Linux 中,这个错误是由于默认的 vagrant 配置 config.ssh.shell 与 bash -l 交互导致的。
Linux 中的 ps aux 命令
发布时间:2023/05/04 浏览次数:69 分类:操作系统
-
本篇文章将讨论 Linux 中的 ps aux 命令。如果将 aux 快捷方式与 ps 命令一起使用,它将显示用户需要的最多信息,并可以为您提供系统运行进程的当前状态。
Linux 中的 NTP
发布时间:2023/05/04 浏览次数:137 分类:操作系统
-
本篇文章将讨论 Linux 中的 ntp。NTP 是大多数 IT 基础设施使用的核心协议。 使用它的目的是同步日期和时间信息。
在 Linux 中计算文件中的唯一行
发布时间:2023/05/04 浏览次数:70 分类:操作系统
-
计算文件中的唯一行是 Linux 中的一项常见任务,可以使用多种不同的工具和方法来执行此操作。使用 sort 和 uniq 命令计算文件中的唯一行数