我在使用适用于Linux的Windows子系统上运行SSH时遇到问题。似乎如果shell没有打开并运行bash,子系统中的所有进程都将被终止。有办法阻止这个吗?
我尝试使用nssm创建服务,但无法使其正常工作。现在我试图启动一个shell,然后将它发送到后台,但我还没弄清楚如何。
答案 0 :(得分:12)
您必须至少打开一个bash控制台才能使后台任务继续运行:只要关闭上一个打开的bash控制台,WSL就会删除所有正在运行的进程。
而且,是的,我们将来会努力改进这种情况;)
在最近的Windows 10 Insider版本中,我们添加了keep daemons and services running in the background的功能,即使您关闭所有Linux控制台也是如此!
此方案的一个剩余限制是您必须手动启动服务(例如,在Ubuntu中为$ sudo service ssh start
),尽管我们正在研究如何允许您自动配置哪些守护进程/服务登录到您的计算机时启动。更新要遵循。
答案 1 :(得分:2)
为了维护WSL进程,我将此文件放在C:\ Users \ USERNAME \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup \ wsl.vbs
set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe -c 'sudo /etc/rc.local'",0
在/etc/rc.local中,我启动了一些服务,最后"睡眠"保持整个运作:
/usr/sbin/sshd
/usr/sbin/cron
#block on this line to keep WSL running
sleep 365d
在/etc/sudoers.d中我添加了一个&rc-local'文件以允许上述命令没有sudo密码提示:
username * = (root) NOPASSWD: /etc/rc.local
username * = (root) NOPASSWD: /usr/sbin/cron
username * = (root) NOPASSWD: /usr/sbin/sshd
这在1607上运作良好但在更新到1704之后我无法再通过ssh连接到wsl。
一旦你有cron运行,你可以使用' sudo crontab -e -u username'使用@reboot定义cron作业以在登录时启动。
答案 2 :(得分:0)
今天早些时候通读了该线程,并使用它在不打开wsl控制台的情况下使sshd运行。 我在Windows 10版本1803上,并在WSL中使用Ubuntu 16.04.5 LTS。 我需要进行一些更改才能使其正常运行。非常感谢Google搜索和类似的社区。 p>
我这样修改/etc/rc.local:
mkdir /var/run/sshd
/usr/sbin/sshd
#/usr/sbin/cron
我需要为sshd添加目录,否则会出现错误“缺少特权分离目录/ var / run / sshd 我之所以将cron注释掉,是因为我遇到了类似的错误,并且没有时间或需要修复它。
我还对sudoers条目进行了一些更改,以使它们起作用:
username ALL = ....
希望这对某人有用。 约翰·巴特勒