WSL 服务自动启动的正确方法

2018年 Windows 10 下的 WSL 已经可以保留后台进程了,从此后,用了十多年的 cygwin 基本失去了存在的价值了。网上有很多 WSL 自动启动服务的方法,但是都有些大大小小的问题,很多又是针对最老的 ubuntu16.04 发行版(输入 bash启动哪个),你如用商店里下载的最新的 WSL 版本 Debian9/Ubuntu18.04 就会出错。

所以正确在 WSL 里自动启动服务的方式有必要记录一下。

创建启动脚本:

进入任意 WSL 发行版中,创建并编辑文件:/etc/init.wsl

#! /bin/sh
/etc/init.d/cron $1
/etc/init.d/ssh $1
/etc/init.d/supervisor $1

里面调用了我们希望启动的三个服务的启动脚本,设置权限为可执行,所有者为 root,这时候可以通过:

sudo /etc/init.wsl [start|stop|restart]

来启停我们需要的服务,在 Windows 中,开始-运行,输入:

shell:startup

按照你 WSL 使用的 Linux 发行版创建启动脚本,比如我创建的 Debian.vbs 文件:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d debian -u root /etc/init.wsl start", vbhide

这个脚本就会在你登陆的时候自动在名字为 "debian" 的 wsl 发行版中执行 /etc/init.wsl 启动我们的服务了,如果你用的是 ubuntu18.04 的发行版,那么修改上面脚本里的 debian 为 ubuntu1804.vbs:

Set ws = CreateObject("Wscript.Shell")
ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide

而如果你不知道自己的 WSL 发行版叫做什么名字,可以用 “wsl -l" 来查看。不管你用最初的 bash (ubuntu 16.04) 还是商店里下载的 debian/ubuntu1804 都能顺利启动服务了。

WSL 中有很多有用的服务,你可以按需删改 /etc/init.wsl ,但没必要塞很多东西进去影响你的启动速度,比如 mysql/mongodb 这些重度服务,可以需要的时候再启动,用完就停了。

我自己用的比较多的服务就三个:sshd(启动了以后支持终端软件登陆wsl,像远程服务器一样操作),supervisord(用于托管其他服务,比如 ssr),crond(crontab,自由定制定时任务),大部分时候,用上面三个足以。

--

感谢评论区的 @楚石 提供了简化版本的 wsl -d 启动方案。

编辑于 2020-06-27 19:26
写下你的评论...

59 条评论
默认
最新
楚石

不用这么麻烦,直接: wsl -d ubuntu -u root /etc/init.d/ssh start

2019-06-20
楚石

这几天在试用wsl2,你的文章对我有很大的启发,感谢。 这是我的研究记录:yuque.com/chushi/bi228r

2019-06-23
韦易笑
作者

帅,我打算把文章后半段全改了。

2019-06-22
布啦豆

wsl需要额外安装,且不支持-l 和-d参数

2020-02-01
Simon Liu

ws.run "ubuntu1804 run sudo /etc/init.wsl start", vbhide 应该改为 ws.run "ubuntu run sudo /etc/init.wsl start", vbhide,否则会报错找不到命令。

2019-01-04
韦易笑
作者

那是你没有安装 ubuntu1804 的 wsl 发行版啊。

2019-01-04
我是大芋头ya

正解

2019-03-18
诸葛不亮
进一步坐实了最好的linux发行版的称呼
2018-10-26
知乎用户oco2WM

可以使用docker clinet,设置远程的docker server

2018-11-16
诸葛不亮

最大的痛点还是在docker,其他都可以将就一下

2018-10-27
韩晓
win10 1804应该是自带sshd了,optional feature里装就好。ssh client 连上再跑wsl 应该可以,就不用wsl维持服务了吧。
2018-10-26
花尼玛

进去之后可以在cmd/powershell中执行wsl -d Ubuntu之类的,hiahia

2021-04-29
韦易笑
没听懂你要说啥
2019-01-17
庖丁解

谢谢大佬, 成功了。

需要注意: chmod +x /etc/init.wsl

07-29
zrs
wsl -d Debian -e sh /home/debian/rsync.sh
02-20
李哈哈哈

我在启动目录创建vbs文件一直提示没权限,属性安全都设了允许

2020-11-10
李哈哈哈
解决办法:将vbs文件放在别的目录,然后复制,在启动目录右击,选择“粘贴快捷方式”就行了。
如果前面不让放vbs文件可以理解,为了安全嘛,但现在放个快捷方式一样的效果却没有限制,有点不可思议。
2020-11-10
冷杉

还是google搜过来大佬的文章靠谱,请把init.wsl添加可执行权限标黄,我搞了半天发现自己脚本没权限。。。

2020-06-28
布啦豆

还是你的文章可行。另外问一句,xrdp,怎么开机启动?你介绍的方式,只启动了xrdp-sesman,没启动xrdp

2020-02-01
王攀

我在应用商店装的18.04,照上面的方法不成功,发现是分发版的名字不对,而且查看分发版的名字也不是“wsl -l”,而是“wslconfig/l”,最后脚本里改成“ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide”就可以了

2019-06-25
王攀

可能是因为我win10是1809的,wsl还没有-l这个参数。

2019-06-26
韦易笑
作者

了解,我修改一下,但是 wsl -l 是可以用来查看发行版名字的啊,你那里运行不了??

2019-06-25
孤云凌天

我用这个方法,没有成功,执行.vbs文件时出现了错误,所以我在/etc/profile里增加一行sudo /etc/init.wsl,运行ubuntu时自动运行服务成功

2019-05-19
韦易笑
作者
那你会重复启动shell
2019-05-19
奶牛人

请问一下WSL上的ubuntu能否连接到win10上ttyUSB设备

2019-04-02
冯钊

在 Windows 中,开始-运行,输入:shell: startup

这一步操作不了吧,这一步怎么操作,目的是什么

2019-01-21
我是大芋头ya

shell:startup 去掉空格

2019-03-18
hippofvcker

冒号后面没有空格

2019-03-06
白纳文
1803 就可以了
2018-11-30
知乎用户G4Jgj2
就是io性能差了点
2018-11-24
知乎用户oco2WM

cmder也不错,不过我一般都是在vscode里卖写代码,束带使用vscode继承的terminal

2018-11-16
韦易笑
作者
我上面评论过了,cmder还是基于cmd.exe的终端,一样有字符错乱情况。
2018-11-16
胡鑫龙
谢谢,刚好用的到
2018-11-07
丁一
终于等到韦神的这篇了 记得之前你就说过wsl的服务问题
2018-10-26
TheGuyInShadow
Bug还是多,我是自己本地docker然后ssh的。
2018-10-26
点击查看全部评论
写下你的评论...

文章被以下专栏收录

想来知乎工作?请发送邮件到 jobs@zhihu.com
登录即可查看 超5亿 专业优质内容
超 5 千万创作者的优质提问、专业回答、深度文章和精彩视频尽在知乎。