Win10 WSL2 Ubuntu Linux 設置程序開機啟動


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;//不顯示程序窗口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM