如何在 WSL2 中创建服务?

如何在 WSL2 中创建服务?

在 WSL2 中,由于没有systemd,因此需要使用service来监控和处理服务。我可以使用以下命令列出所有服务:sudo service --status-all

我的问题很简单:如何在此列表中添加新服务以便与其进行交互?

例如,我想创建一个服务greeter。我创建了以下文件greeter.service

[Unit]
Description=My Greeting Service

[Service]
Type=oneshot
ExecStart=~/repos/random-scripts/greeter.sh

简单的问候 shell 脚本在哪里greeter.sh。我猜应该把这个greeter.service文件复制到一个特定的目录中,但我不知道是哪一个。任何帮助都将不胜感激。

答案1

您显示的文件greeter.service实际上是 Systemd 单元文件。但是,正如您所说,Ubuntu 在 WSL 上不直接支持 Systemd,因此这种特定方法行不通。

您有以下几种选择:

为服务编写 SysVInit 脚本

service命令用于与旧式 SysVInit 服务交互。创建 SysVInit 服务通常通过编写响应以下参数的 shell 脚本来完成:

  • start
  • stop
  • restart
  • status

如果 Ask Ubuntu 上有示例,那么它隐藏在搜索结果的很深处。我相信在 Ask Ubuntu 创建时,Upstart 已经取代 SysVInit 成为默认的 init 方法,然后 Systemd 取代了 Upstart。

但我发现这个例子在 Github(MIT 许可证)上,看起来相当可靠。

从该样板中可以看出,您的脚本负责跟踪 PID,以便它可以检查它是否正在运行(对于statusrestart调用),知道如何终止它(对于stop)等等。

您可以将这个脚本放在其中/etc/init.dservice命令将能够与其进行交互。

通过另一个流程主管

但是 Systemd 和 SysVInit 的其他后继者出现了,因为它完全有可能以更标准化的方式处理大多数服务的样板。

Systemd 的问题(与 WSL 相关)在于,它将其 PID1 Init 进程与进程监管结合在一起。WSL 有自己的 init 系统,以 PID1 运行,这意味着我们也不能使用 Systemd 进程监管。

但是许多其他进程管理器能够与 PID1 分离,这意味着它们可以在 WSL 下正常运行。

我知道其中一个与 WSL/Ubuntu 相当兼容(并且可以通过 安装apt)的是主管

为此,你可以创建类似以下内容的内容/etc/supervisor/conf.d/greeter.conf

[program:greeter]
command=/home/youruser/repos/random-scripts/greeter.sh

启动supervisord然后通过以下方式与您的服务进行交互:

supervisorctl start greeter
supervisorctl stop greeter
...

A动作次数可用。

如果你使用的是 Windows 11,则可以supervisord通过将其添加到你的/etc/wsl.conf启动中来自动启动这个答案

在其他发行版上,我运行过dinit(Artix Linux)和openrc(Alpine),但对于 Ubuntu,我可能会坚持使用 Supervisord。

相关内容