![WSL 在启动时运行服务](https://linux22.com/image/169555/WSL%20%E5%9C%A8%E5%90%AF%E5%8A%A8%E6%97%B6%E8%BF%90%E8%A1%8C%E6%9C%8D%E5%8A%A1.png)
老实说,我不确定这是否是 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。我的需求是
- 启动 xrdp(这样我就可以连接到 GUI 会话)
- 将 eth0 mtu 设置为 1350(由于 mtu,WSL 在使用 VPN 时出现连接问题)
- 使用上游解析器进行更新(无论在 中
resolv.conf
如何,都会通过 WSL 不断更新)generateResolvConf = false
wsl.config
因此,我所做的就是扩展 @NotTheDr01ds 的答案。
.mystartup.sh
将所有命令放入主目录中的新 shell 脚本中.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