WSL 在启动时运行服务

WSL 在启动时运行服务

老实说,我不确定这是否是 WSL 的问题,或者我只是对 Ubuntu 做了一些错误的事情,但我无法让 cron 服务在我的 WSL 系统上启动时运行。

它开始得很好:

sudo service cron start

但即使在以下情况之后它也不会在启动时启动:

sudo update-rc.d cron defaults
sudo update-rc.d cron enable

版本:

$ uname -a
Linux PC-01 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

答案1

我刚刚在为刚刚提出的另一个问题搜索潜在的“重复项”时发现的老问题。将答案放在这里,因为这是“wsl start services”的第一个搜索结果。

有一个当前的答案和一个未来答案(基于当前可用的 WSL Windows 10/11 预览版)。

目前的答案是WSL没有“启动服务”的概念。 Microsoft 的init进程既不像“普通”Linux 系统上的 SysVinit 也不是 Systemd init。

如果您想自动启动服务,有现在有两种方法可以实现这一点,第三种方法将在下一个 WSL 版本中提供:


  • 选项 1:设置 Windows“计划任务”在登录时运行(而不是启动时运行):

    • 该任务可以是“基本任务”
    • “启动一个程序”
    • 该“计划”是wsl.exe
    • 而“论据”应该是-u root service cron start

    这将以 root 用户身份登录时运行 WSL(启动服务所需)并运行命令service cron start。当然,可以修改它以运行任何具有init.d脚本的服务。请注意,如果您安排任务在 Windows 启动时运行,则此方法(至少目前)不起作用,因为 WSL 似乎要求用户登录才能保持进程在后台运行。


  • 选项 2:修改 shell 启动以检查服务是否正在运行,并在需要时启动它。

    在您的启动中(通常~/.bashrc)添加以下行:

    wsl.exe -u root sh -c "service cron status || service cron start"
    

    在“普通”Linux 下,您需要visudo并授予自己在没有密码的情况下运行命令的权限(或每次登录时键入密码)。使用wsl.exe -u root来自之内WSL 允许您绕过这个。


  • 选项 3: Windows 11 中的一项新功能是能够使用该/etc/wsl.conf文件指定 WSL 的启动任务。如果您使用的是 Windows 11,请使用以下行创建该文件:

    [boot]
    command="service cron start"
    

    根据微软文档,这将在 WSL 实例启动时以 root 身份运行该命令。

    如果您需要在 WSL 启动时运行多个命令,请在同一command行中用分号分隔它们:

    [boot]
    command="service ssh start; service cron start"
    

答案2

这篇文章帮助我得到了我想要的东西,但是我需要运行多个命令(启动 xrdp、调整 eth0 mtu、更新 resolv.conf),并且运行wsl.exe多次会实例化多个 root 登录,从而导致文件锁定出现一些问题,resolv.conf可能是因为 WSL 做了一些操作每次登录时都进行设置,但不是积极的。

我正在使用 wsl2 内核版本:5.10.102.1 Windows 10 和 Ubuntu 20.04.5 LTS。我的需求是

  1. 启动 xrdp(这样我就可以连接到 GUI 会话)
  2. 将 eth0 mtu 设置为 1350(由于 mtu,WSL 在使用 VPN 时出现连接问题)
  3. 使用上游解析器进行更新(无论在 中resolv.conf如何,都会通过 WSL 不断更新)generateResolvConf = falsewsl.config

因此,我所做的就是扩展 @NotTheDr01ds 的答案。

  1. .mystartup.sh将所有命令放入主目录中的新 shell 脚本中
  2. .mystartup.sh以 root 身份调用.profile

这是我添加的内容.profile

# startup stuff
# run startup script as root
wsl.exe -u root /home/user/.mystartup.sh

这是.mystartup.sh

# startup stuff
# service xrdp start
service xrdp status || service xrdp start

# setup lower mtu for vpn links
ifconfig eth0 mtu 1350
echo "eth0 mtu updated!"

# remove link to /run/resolvconf/resolv.conf & create new
rm -f /etc/resolv.conf
touch /etc/resolv.conf
chmod u+rwx,g+rwx,o+rx /etc/resolv.conf

# setup nameservers
echo "# this resolv.conf created using user .profile script" >> /etc/resolv.conf
echo "# wsl auto-generate must be disabled in /etc/wsl.config" >> /etc/resolv.conf
echo "nameserver 10.0.0.50" >> /etc/resolv.conf
echo "nameserver 10.0.0.51" >> /etc/resolv.conf
echo "resolv.conf modified with custom dns resolvers!"
echo

相关内容