自动初始化多个 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 supervisorctl
和 man 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 终端
我想制作一个 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 supervisorctl
和man 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 终端