Win10 WSL2 Ubuntu Linux 設置程序開機啟動
由於WSL2里面不能用systemd,所以WSL2里面的程序啟動需要借助外部腳本
大致過程如下:
win10開機 =====> win10開機腳本 =====> Linux子系統腳本 =====> 啟動Linux程序
我們以Mysql為樣例
安裝配置Mysql
具體安裝過程不敘述,安裝配置完成之后,可以通過
service mysql start
即可
編寫 啟動Mysql 腳本
在 /etc 目錄下新增 init.wsl 文件
sudo vim /etc/init.wsl
輸入以下內容,並保存
#! /bin/sh
service mysql stop
usermod -d /var/lib/mysql/ mysql
service mysql start
由於mysql異常關機后啟動,會有錯誤提示,這里先停止,再啟動
編寫win10開機腳本
該腳本的目的是運行 linux子系統中的腳本。
可以用VBS執行
Set ws = WScript.CreateObject("WScript.Shell")
ws.run "wsl -d Ubuntu-20.04 -u root /etc/init.wsl"
將運行另存為 linux-start.vbs,並拷貝到
C:\Users\當前用戶\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 目錄(運行 shell:startup,可以直接打開該目錄)
優化開機腳本,去除討厭的黑框框
該腳本再每次開機執行時都會彈出煩人的黑框框,除去方式有很多種,這里我使用C# Winform程序作為開機啟動linux服務程序。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
namespace linux_start
{
static class Program
{
/// <summary>
/// 應用程序的主入口點。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
var cmd = "wsl -d Ubuntu-20.04 -u root /etc/init.wsl";
RunCmd(cmd);
}
catch { }
// 不需要運行界面
//Application.Run(new Form1());
}
static void RunCmd(string strCMD)
{
//創建一個進程
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;//是否使用操作系統shell啟動
p.StartInfo.RedirectStandardInput = true;//接受來自調用程序的輸入信息
p.StartInfo.RedirectStandardOutput = true;//由調用程序獲取輸出信息
p.StartInfo.RedirectStandardError = true;//重定向標准錯誤輸出
p.StartInfo.CreateNoWindow = true;//不顯示程序窗口
p.Start();//啟動程序
//向cmd窗口發送輸入信息
p.StandardInput.WriteLine(strCMD + "&exit");
p.StandardInput.AutoFlush = true;
//獲取cmd窗口的輸出信息
string output = p.StandardOutput.ReadToEnd();
//等待程序執行完退出進程
p.WaitForExit();
p.Close();
}
}
}
該程序關鍵點在於 ,該方式可以 執行腳本而不彈出黑框框窗口
p.StartInfo.UseShellExecute = false;//是否使用操作系統shell啟動
p.StartInfo.CreateNoWindow = true;//不顯示程序窗口