自动初始化多个 wsl 实例

Automating the initialisation of multiple wsl instances

我想制作一个 shell 脚本(或类似的东西)来启动 6 个独立的 wsl 终端,然后在每个终端上执行一个特定的程序。每个程序都是一个服务器,所以不能从同一个终端完成,因为它们是非终止程序。

可能吗?

如有任何帮助,我们将不胜感激!

K

编辑:所以现在我看到一个文件 newWsl.ps1 在 powershell:

cmd.exe /c start wsl.exe --cd "~" 

然后运行:

powershell -ExecutionPolicy ByPass -File .\newWsl.ps1

是一个开始,但是,现在文档似乎非常稀少。

理想情况下,类似于:

cmd.exe /c start wsl.exe --cd "~" -run "script.sh" 

是我需要的(script.sh 位于 wsl 主目录中)!

有几种方法可以做到这一点。你没有提到你的发行版,所以我假设 Ubuntu 因为它是 WSL 的默认值:

  • 选项 1:主管(或同等学历)

    通常,如果您要在 Linux 中启动六个不同的服务器,您会希望通过 Systemd 来完成。 WSL 不容易支持 Systemd(由于 Systemd 坚持 运行 作为 PID1)。然而,我们可以很容易地使用另一个不需要 PID1 的进程监督程序。 supervisord 是我之前在 Ubuntu 上用过的。

    sudo apt install supervisor supervisor-doc
    

    /etc/supervisor/conf.d/ 中为您的每个服务器创建一个文件。例如:

    /etc/supervisor/conf.d/:

    [program:program1]
    command=/home/youruser/program1.sh
    autostart=true
    redirect_stderr=true
    stdout_logfile=/home/youruser/program1.log
    directory=/home/youruser
    user=youruser
    

    为您的每台服务器创建一个 conf。

    然后,启动 sudo supervisord 将启动您的所有服务器。在启动 WSL 时执行此操作:

    wsl -u root supervisord -c /etc/supervisor/supervisord.conf
    

    您还可以打开另一个 WSL 实例并查看它们 运行:

    ps -efH
    sudo supervisorctl status
    

    您还可以在每个日志文件中看到捕获的输出。

    有关配置和控制服务器的详细信息,请参阅 man supervisorctlman supervisor


  • 选项 2:Tmux

    如果您需要前台服务器的所有输出,我建议通过 Tmux 运行 服务器,它默认安装在 WSL 的 Ubuntu 中。启动多个 Tmux windows,每个都有不同的应用程序,通过:

    wsl -e tmux new-session ~/program1.sh `; new-window ~/program2.sh `; new-window ~/program3.sh # and so on
    

    然后用Ctrl+B1(或2、3等)在它们之间切换。就个人而言,对于 Tmux,我总是将前缀切换为 Ctrl+A。这是 screen(它的前身)的默认值,而且要达到 finger-twister 要少得多。


  • 选项 3:PowerShell Start-Process

    最后,您可能认为您正在寻找的(根据您的问题的措辞方式)是 PowerShell 中的 Start-Process。它的默认行为是为每个应用程序创建一个新进程。

    Start-Process wsl -ArgumentList "~ -e ./program1.sh"
    Start-Process wsl -ArgumentList "~ -e ./program2.sh"
    Start-Process wsl -ArgumentList "~ -e ./program3.sh"
    

    也许是。虽然我更喜欢 Supervisor 或 Tmux 方法,但您可能更喜欢 use-case.

    的多个 WSL 终端