You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以登录态启动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启动时自动执行脚本:

  1. 在WSL内创建/etc/wsl.conf文件,添加:
    [boot]
    command = "/root/bin/start.sh"
    
  2. 重启WSL后,启动发行版时会自动执行该脚本:
    wsl --terminate distro
    wsl -d distro
    

内容的提问来源于stack exchange,提问作者PfunnyGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 11:24:24