WSL 在啟動時執行服務

WSL 在啟動時執行服務

老實說,我不確定這是否是 WSL 的問題,或者我只是對 Ubuntu 做了一些錯誤的事情,但我無法讓 cron 服務在我的 WSL 系統上啟動時運行。

它開始得很好:

sudo service cron start

但即使在以下情況之後它也不會在啟動時啟動:

sudo update-rc.d cron defaults
sudo update-rc.d cron enable

版本:

$ uname -a
Linux PC-01 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

答案1

我剛剛在為剛剛提出的另一個問題搜尋潛在的“重複”時發現的老問題。將答案放在這裡,因為這是「wsl start services」的第一個搜尋結果。

有一個目前的答案和一個未來答(基於目前可用的 WSL Windows 10/11 預覽版)。

目前的答案是WSL沒有「啟動服務」的概念。 Microsoft 的init進程既不像「普通」Linux 系統上的 SysVinit 也不是 Systemd init。

如果您想自動啟動服務,有現在有兩種方法可以實現這一點,第三種方法將在下一個 WSL 版本中提供:


  • 選項 1:設定 Windows「排程任務」在登入時執行(而非啟動時執行):

    • 該任務可以是“基本任務”
    • “啟動一個程式”
    • 該「計劃」是wsl.exe
    • 而「論點」應該是-u root service cron start

    這將以 root 使用者身分登入時執行 WSL(啟動服務所需)並執行命令service cron start。當然,可以修改它以運行任何具有init.d腳本的服務。請注意,如果您安排任務在 Windows 啟動時運行,則這(至少目前)不起作用,因為 WSL 似乎要求使用者登入才能保持進程在後台運行。


  • 選項 2:修改 shell 啟動以檢查服務是否正在運行,並在需要時啟動它。

    在您的啟動中(通常~/.bashrc)新增以下行:

    wsl.exe -u root sh -c "service cron status || service cron start"
    

    在「普通」Linux 下,您需要visudo並授予自己在沒有密碼的情況下執行命令的權限(或每次登入時鍵入密碼)。使用wsl.exe -u root來自之內WSL 允許您繞過這個。


  • 選項 3: Windows 11 中的一項新功能是能夠使用該/etc/wsl.conf檔案指定 WSL 的啟動任務。如果您使用的是 Windows 11,請使用下列行建立該檔案:

    [boot]
    command="service cron start"
    

    根據微軟文件,這將在 WSL 實例啟動時以 root 身分執行該命令。

    如果您需要在 WSL 啟動時執行多個命令,請在同一command行中用分號分隔它們:

    [boot]
    command="service ssh start; service cron start"
    

答案2

這篇文章幫助我得到了我想要的東西,但是我需要運行多個命令(啟動 xrdp、調整 eth0 mtu、更新 resolv.conf),並且運行wsl.exe多次會實例化多個root 登錄,從而導致文件鎖定出現一些問題,resolv.conf可能是因為 WSL 做了一些操作每次登入時都會進行設置,但不是積極的。

我正在使用 wsl2 核心版本:5.10.102.1 Windows 10 和 Ubuntu 20.04.5 LTS。我的需求是

  1. 啟動 xrdp(這樣我就可以連接到 GUI 會話)
  2. 將 eth0 mtu 設定為 1350(由於 mtu,WSL 在使用 VPN 時出現連線問題)
  3. 使用上游解析器進行更新(無論在 中resolv.conf如何,都會透過 WSL 不斷更新)generateResolvConf = falsewsl.config

因此,我所做的就是擴展 @NotTheDr01ds 的答案。

  1. .mystartup.sh將所有指令放入主目錄中的新 shell 腳本中
  2. .mystartup.sh以 root 身分調用.profile

這是我添加的內容.profile

# startup stuff
# run startup script as root
wsl.exe -u root /home/user/.mystartup.sh

這是.mystartup.sh

# startup stuff
# service xrdp start
service xrdp status || service xrdp start

# setup lower mtu for vpn links
ifconfig eth0 mtu 1350
echo "eth0 mtu updated!"

# remove link to /run/resolvconf/resolv.conf & create new
rm -f /etc/resolv.conf
touch /etc/resolv.conf
chmod u+rwx,g+rwx,o+rx /etc/resolv.conf

# setup nameservers
echo "# this resolv.conf created using user .profile script" >> /etc/resolv.conf
echo "# wsl auto-generate must be disabled in /etc/wsl.config" >> /etc/resolv.conf
echo "nameserver 10.0.0.50" >> /etc/resolv.conf
echo "nameserver 10.0.0.51" >> /etc/resolv.conf
echo "resolv.conf modified with custom dns resolvers!"
echo

相關內容