如何在 WSL2 中创建服务?

4 bash scripts services windows-subsystem-for-linux 20.04

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

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

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

[Unit]
Description=My Greeting Service

[Service]
Type=oneshot
ExecStart=~/repos/random-scripts/greeter.sh
Run Code Online (Sandbox Code Playgroud)

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

Not*_*1ds 5

您显示的文件greeter.service实际上是 Systemd 单元文件。但是,正如您所说,WSL 上的 Ubuntu 中没有对 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 下运行得很好。

apt我知道与 WSL/Ubuntu 非常兼容(并且可以通过安装)的其中之一是Supervisord

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

[program:greeter]
command=/home/youruser/repos/random-scripts/greeter.sh
Run Code Online (Sandbox Code Playgroud)

通过以下方式启动supervisord并与您的服务交互:

supervisorctl start greeter
supervisorctl stop greeter
...
Run Code Online (Sandbox Code Playgroud)

有多种操作可供选择。

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

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