在 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,以便它可以检查它是否正在运行(对于status
或restart
调用),知道如何终止它(对于stop
)等等。
您可以将这个脚本放在其中/etc/init.d
,service
命令将能够与其进行交互。
通过另一个流程主管
但是 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。