
Честно говоря, я не уверен, является ли это проблемой 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 Preview).
Текущий ответ заключается в том, что в WSL нет концепции "стартовых служб". init
Процесс Microsoft не является ни SysVinit, ни Systemd init, как в "обычных" системах Linux.
Если вы хотите запускать службы автоматически, естьв настоящее времяЭто можно сделать двумя способами, третий появится в следующем выпуске WSL:
Вариант 1: Настройте «Запланированную задачу» Windows для запуска при входе в систему (не при загрузке):
- Задача может быть «Базовой задачей»
- «Начать программу»
- «Программа» — это
wsl.exe
- И «Аргументы» должны быть
-u root service cron start
Это запустит WSL при входе в систему как пользователь root (необходимо для запуска служб) и запустит команду
service cron start
. Конечно, это можно изменить для запуска любой службы, у которой есть скриптinit.d
. Обратите внимание, что это не работает (по крайней мере, в настоящее время), если вы запланируете запуск задачи при загрузке Windows, поскольку WSL, похоже, требует, чтобы пользователь вошел в систему, чтобы процесс продолжал работать в фоновом режиме.
Вариант 2: Измените запуск оболочки, чтобы проверить, запущена ли служба, и запустить ее при необходимости.
В вашем стартовом файле (обычно
~/.bashrc
) добавьте следующую строку:wsl.exe -u root sh -c "service cron status || service cron start"
В «обычном» Linux вам нужно будет
visudo
и дать себе разрешение на запуск команды без пароля (или вводить пароль каждый раз при входе в систему). Использованиеwsl.exe -u root
fromв пределахWSL позволяет обойти это.
Вариант 3: Новая функция в Windows 11 — возможность указывать задачи запуска для WSL с помощью
/etc/wsl.conf
файла. Если у вас Windows 11, создайте этот файл со следующими строками:[boot] command="service cron start"
СогласноMicrosoft документ, то при запуске экземпляра 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 (чтобы я мог подключиться к сеансу графического интерфейса)
- Установите eth0 mtu на 1350 (у WSL возникли проблемы с подключением при использовании VPN из-за mtu)
- Обновление
resolv.conf
с помощью вышестоящих резолверов (продолжает обновляться WSL независимо от того,generateResolvConf = false
вwsl.config
)
Итак, чтобы расширить ответ @NotTheDr01ds, вот что я сделал.
- Поместите все команды в новый скрипт оболочки
.mystartup.sh
в домашнем каталоге. - Вызовите
.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