如何以登录态启动WSL并自动运行自定义服务?
WSL Ubuntu 启动自执行服务的解决建议
核心问题分析
你遇到的30秒自动停止是WSL默认行为:无活跃交互式会话时,WSL会自动回收资源终止实例;同时之前的命令存在路径错误、未保持会话、服务未后台运行等问题。
具体解决步骤
1. 调整启动脚本,确保服务后台运行且保持会话
修改/root/bin/start.sh,给每个服务启动命令加上nohup脱离终端,并在脚本末尾添加保持会话的命令:
# 启动第一个服务,输出日志到指定文件 nohup /path/to/your/service1 > /var/log/service1.log 2>&1 & # 启动第二个服务 nohup /path/to/your/service2 > /var/log/service2.log 2>&1 & # 另外两个服务同理添加 # 保持WSL会话不自动退出 tail -f /dev/null
注:替换
/path/to/your/service*为实际服务的启动命令或脚本路径
2. 修正PowerShell执行命令格式
用以下命令直接测试(先不用Start-Job,确保基础命令可用):
wsl -d distro -u root bash -i -l -c "/root/bin/start.sh"
- 确保路径是Linux格式(不要用Windows的
.\) -i -l参数确保加载登录shell的环境变量(对应.profile/.bashrc的配置)
3. 禁止WSL自动终止会话
在Windows用户目录(C:\Users\你的用户名)下创建.wslconfig文件,添加以下内容:
[wsl2] autoMemoryReclaim=disabled localhostForwarding=true
之后重启WSL生效:
wsl --terminate distro
此配置会让WSL实例一直运行,避免自动回收,代价是占用更多内存,可根据需求调整。
4. Python脚本中的正确调用方式
用subprocess.Popen实现后台启动,避免Python脚本阻塞:
import subprocess # 启动WSL并执行脚本 subprocess.Popen( ["wsl", "-d", "distro", "-u", "root", "bash", "-i", "-l", "-c", "/root/bin/start.sh"], shell=False, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )
5. 排查服务状态
执行命令后,通过以下方式确认服务是否启动:
# 查看服务进程 wsl -d distro -u root ps aux | grep "service1" # 查看服务日志 wsl -d distro -u root cat /var/log/service1.log
6. 替代方案:用WSL系统启动脚本
如果不需要依赖用户登录环境,可配置WSL启动时自动执行脚本:
- 在WSL内创建
/etc/wsl.conf文件,添加:[boot] command = "/root/bin/start.sh" - 重启WSL后,启动发行版时会自动执行该脚本:
wsl --terminate distro wsl -d distro
内容的提问来源于stack exchange,提问作者PfunnyGuy
相关产品推荐
相关产品推荐

