Ubuntu
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
我在為剛剛提出的另一個問題搜尋潛在“重複”時發現的舊問題。將答案放在這裡,因為這是“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"