我有安装了 WSL2 的 Windows 10 和 Ubuntu 20.04。我试图让 mailhog 在后台自动启动,就像 mysql 为我做的那样。
我已经安装了 mailhog,并创建了/etc/systemd/system/mailhog.service
一个
[Unit]
Description=MailHog service
[Service]
ExecStart=/home/dzoljom/.phpenv/shims/mailhog \
-api-bind-addr 127.0.0.1:8025 \
-ui-bind-addr 127.0.0.1:8025 \
-smtp-bind-addr 127.0.0.1:1025
[Install]
WantedBy=multi-user.target
在其中。我指向 phpenv 路径,因为我使用 phpenv 来处理不同的 php 版本。不确定这是否是正确的方法,但我已将其复制到该路径,当我在一个终端窗口中手动启动 mailhog 时
/home/dzoljom/.phpenv/shims/mailhog \
-api-bind-addr 127.0.0.1:8025 \
-ui-bind-addr 127.0.0.1:8025 \
-smtp-bind-addr 127.0.0.1:1025
它可以运行并从 Laravel 应用程序捕获我的邮件。
现在,所有教程都说要使用systemctl
,但我在 WSL2 上没有它,只有service
命令可用。但是当我输入时,service --status-all
我没有看到 mailhog 服务可用,而且我无法输入,service mailhog start
因为这不是可识别的服务。
这是可以做到的吗,或者我是否需要在需要时手动启动它(此时我可能只会在我的 zshconfig 中为它创建一个快捷方式)?
答案1
简短回答:至少在 WSL 下,你需要“手动”启动它。我说“在 WSL 下”,因为你能使用 Windows 任务管理器任务使其在用户登录时出现。只需使用类似以下命令创建任务:
wsl /home/dzoljom/.phpenv/shims/mailhog -api-bind-addr 127.0.0.1:8025 -ui-bind-addr 127.0.0.1:8025 -smtp-bind-addr 127.0.0.1:1025
较长的答案:
需要澄清几点。首先,你说:
让 mailhog 在后台自动启动,mysql 对我的作用是一样的。(强调添加)
如果 MySQL 在 WSL 下运行,它可能会受到同样的限制。WSL init
(PID 1)没有像 SysVInit 或 Systemd 那样在启动时运行应用程序或脚本的概念。通过命令wsl
(或其较早的兄弟命令之一,如bash.exe
)启动时,WSL 实例处于“正在运行”状态。
只要至少有一个“非初始化”进程作为其进程树的子进程运行,它们就会处于“运行”状态。因此,如果您的 shell 正在运行,那就足够了。或者,如果mysqld
正在运行,它也会继续运行。
当所有正在运行的进程终止时,WSL 将“停止”该实例,通常在几秒钟内。
我很好奇你是如何让 MySQL“自动”启动的。我们应该能够对 MailHog 使用相同的方法。
其次,您在问题中写的文件是 Systemd 单元文件,而不是服务初始化脚本。在 Ubuntu 下,至少在 WSL 中,许多软件包(例如 MySQL,我相信)仍然包含 SystemVInit 脚本,以便该service
命令可以正常工作。您可以在 中找到这些/etc/init.d
。
WSL 下的一些发行版(例如 openSUSE 或 Debian)已经完全取消了这些,只提供 Systemd 版本。当然,正如你所注意到的,Systemd 不能在 Windows 上运行(至少在没有大量工作的情况下不能运行,如果你愿意,你可以在其他地方搜索)。
但是,如果 MailHog 包没有提供service
等效脚本,那么您将无法service
像使用 MySQL 那样使用命令来启动它。没关系,正如您所注意到的,完全可以通过其可执行文件运行守护进程。无论如何,这通常是 Systemd 单元文件或 SysVInit 脚本的最终结果。
你也可以通过简单的网络搜索找到旧的 MailHog 初始化脚本。以下是一个例子我找到了。不能保证它的效果如何,但至少你可以用它作为起点。然后你可以service
像使用 MySQL 一样使用该命令。
这至少会使某件事成为service mailhog status || service mailhog start
可能——这是“如果 mailhog 没有运行,则启动它”的简写。