Ubuntu

WSL 在啟動時執行服務

  • December 18, 2021

老實說,我不確定這是否是 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

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

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

目前的答案是 WSL 沒有“啟動服務”的概念。Microsoft 的init程序既不是 SysVinit 也不是 Systemd init,就像在“普通”Linux 系統上一樣。

如果您想自動啟動服務,目前有兩種方法可以實現,第三種方法將在下一個 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:/etc/wsl.conf Windows 11 中的一項新功能是能夠使用該文件 為 WSL 指定啟動任務。如果您有 Windows 11,請使用以下行創建該文件:
[boot]
command="service cron start"

根據Microsoft doc,這將在 WSL 實例啟動時以 root 身份執行命令。

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

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

引用自:https://unix.stackexchange.com/questions/574070