
老實說,我不確定這是否是 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。我的需求是
- 啟動 xrdp(這樣我就可以連接到 GUI 會話)
- 將 eth0 mtu 設定為 1350(由於 mtu,WSL 在使用 VPN 時出現連線問題)
- 使用上游解析器進行更新(無論在 中
resolv.conf
如何,都會透過 WSL 不斷更新)generateResolvConf = false
wsl.config
因此,我所做的就是擴展 @NotTheDr01ds 的答案。
.mystartup.sh
將所有指令放入主目錄中的新 shell 腳本中.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