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 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 rootfromв пределах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. Мои потребности были

  1. Запустить xrdp (чтобы я мог подключиться к сеансу графического интерфейса)
  2. Установите eth0 mtu на 1350 (у WSL возникли проблемы с подключением при использовании VPN из-за mtu)
  3. Обновление resolv.confс помощью вышестоящих резолверов (продолжает обновляться WSL независимо от того, generateResolvConf = falseв wsl.config)

Итак, чтобы расширить ответ @NotTheDr01ds, вот что я сделал.

  1. Поместите все команды в новый скрипт оболочки .mystartup.shв домашнем каталоге.
  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

Связанный контент