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 启动方案。
不用这么麻烦,直接: wsl -d ubuntu -u root /etc/init.d/ssh start
这几天在试用wsl2,你的文章对我有很大的启发,感谢。 这是我的研究记录:https://www.yuque.com/chushi/bi228r/readme
帅,我打算把文章后半段全改了。
wsl需要额外安装,且不支持-l 和-d参数
ws.run "ubuntu1804 run sudo /etc/init.wsl start", vbhide 应该改为 ws.run "ubuntu run sudo /etc/init.wsl start", vbhide,否则会报错找不到命令。
那是你没有安装 ubuntu1804 的 wsl 发行版啊。
正解
可以使用docker clinet,设置远程的docker server
最大的痛点还是在docker,其他都可以将就一下
进去之后可以在cmd/powershell中执行wsl -d Ubuntu之类的,hiahia
谢谢大佬, 成功了。
需要注意: chmod +x /etc/init.wsl
我在启动目录创建vbs文件一直提示没权限,属性安全都设了允许
如果前面不让放vbs文件可以理解,为了安全嘛,但现在放个快捷方式一样的效果却没有限制,有点不可思议。
还是google搜过来大佬的文章靠谱,请把init.wsl添加可执行权限标黄,我搞了半天发现自己脚本没权限。。。
还是你的文章可行。另外问一句,xrdp,怎么开机启动?你介绍的方式,只启动了xrdp-sesman,没启动xrdp
我在应用商店装的18.04,照上面的方法不成功,发现是分发版的名字不对,而且查看分发版的名字也不是“wsl -l”,而是“wslconfig/l”,最后脚本里改成“ws.run "wsl -d Ubuntu-18.04 -u root /etc/init.wsl start", vbhide”就可以了
可能是因为我win10是1809的,wsl还没有-l这个参数。
了解,我修改一下,但是 wsl -l 是可以用来查看发行版名字的啊,你那里运行不了??
我用这个方法,没有成功,执行.vbs文件时出现了错误,所以我在/etc/profile里增加一行sudo /etc/init.wsl,运行ubuntu时自动运行服务成功
请问一下WSL上的ubuntu能否连接到win10上ttyUSB设备
在 Windows 中,开始-运行,输入:shell: startup
这一步操作不了吧,这一步怎么操作,目的是什么
shell:startup 去掉空格
冒号后面没有空格
cmder也不错,不过我一般都是在vscode里卖写代码,束带使用vscode继承的terminal