Рабочее место 1С на Linux через WSL. Часть 2 - Автоматизация запуска служб в WSL и переход на systemd
В первой лабораторной работе мы успешно развернули рабочее место программиста 1С на Linux внутри подсистемы WSL. Однако у текущей конфигурации есть существенное неудобство: при каждом перезапуске Windows или перезапуске WSL-окружения нам приходится вручную запускать службы PostgreSQL и сервера 1С. В этой статье мы подробно разберем, почему стандартные линуксовые механизмы автозапуска не работают в WSL "из коробки", как настроить беспарольный запуск служб и переложить задачу их автоматического старта на планировщик Windows.
Теоретическая часть
### Ограничение WSL: отсутствие systemd по умолчанию В большинстве современных дистрибутивов Linux (включая Ubuntu) в качестве системы инициализации используется systemd. Для автозапуска служб администраторы привыкли использовать команду:
sudo systemctl enable postgresql
Однако в классическом окружении WSL при попытке выполнить любую команду systemctl вы неизбежно столкнетесь с ошибкой: System has not been booted with systemd as init system (PID 1). Can't operate. Почему это происходит? Подсистема WSL запускает Linux-окружение в облегченном контейнере, где процесс с идентификатором PID 1 - это не стандартный инициализатор systemd, а специальный инициализирующий процесс WSL (init). Без systemd в качестве PID 1 утилита systemctl не может управлять службами. ### SysVinit (service) vs Systemd (systemctl) Поскольку systemctl не работает, в WSL для ручного управления службами приходится использовать более старую утилиту service (подсистема инициализации SysVinit):
sudo service postgresql start
sudo service srv1cv83 start
Хотя для WSL на начальном этапе этого достаточно, опытные разработчики и администраторы в комментариях отмечают, что systemd гораздо более функциональна, так как содержит мощные механизмы логирования сетевой и системной активности, а также предоставляет гибкие средства для фонового мониторинга кластера. ### Архитектура автоматизации в WSL Так как полноценного демона инициализации в WSL по умолчанию нет, службы не могут стартовать сами при инициализации Linux. Нам нужно решить две задачи:
- Разрешить беспарольный запуск служб: Утилита service требует прав суперпользователя (sudo), а значит - интерактивного ввода пароля. Для автоматизации нам нужно разрешить конкретному пользователю выполнять запуск и остановку СУБД и сервера 1С без ввода пароля.
- Связать старт с загрузкой хоста: Мы настроим Планировщик задач Windows, который при запуске операционной системы будет обращаться к WSL и давать команду на старт необходимых служб.
Пошаговая инструкция
### Шаг 1. Настройка беспарольного запуска служб в Linux Для редактирования конфигурационного файла sudoers (который управляет правами sudo) в Linux используется специальная утилита visudo. Она проверяет синтаксис файла перед сохранением, предотвращая случайную блокировку системы.
- Запустите терминал Ubuntu в ConEmu.
- Выполните команду редактирования:
sudo visudo
- Прокрутите файл в самый конец и добавьте строки, разрешающие вашему пользователю (в оригинальной статье использовался пользователь pen) запускать службы без ввода пароля:
pen ALL=(ALL) NOPASSWD: /usr/sbin/service postgresql *
pen ALL=(ALL) NOPASSWD: /usr/sbin/service srv1cv83 *
Примечание: Символ на конце указывает, что беспарольный режим распространяется на любые параметры команды service postgresql и service srv1cv83 (start, stop, status, restart).*
- Если visudo использует редактор nano: для сохранения нажмите Ctrl + O, затем Enter. Для выхода нажмите Ctrl + X.
- Проверьте работоспособность настройки. Перезапустите службы. Теперь система не должна запрашивать пароль:
sudo service postgresql stop
sudo service postgresql start
### Шаг 2. Настройка Планировщика задач Windows Теперь настроим запуск этих команд со стороны Windows при старте компьютера.
- В Windows нажмите клавиши Win + R, введите taskschd.msc и нажмите Enter, чтобы открыть Планировщик задач.
- В правой панели выберите «Создать задачу...» (Create Task).
- На вкладке «Общие» (General):
- Укажите имя задачи: WSL_1C_Services_AutoStart
- Выберите опцию «Выполнять для всех пользователей» (Run whether user is logged on or not) - это позволит службам запускаться даже до того, как вы ввели пароль от Windows.
- Установите флажок «Выполнять с наивысшими правами» (Run with highest privileges).
- На вкладке «Триггеры» (Triggers) нажмите «Создать...» (New):
- В поле «Начать задачу» выберите «При запуске компьютера» (At startup) или «При входе в систему» (At log on). Нажмите OK.
- На вкладке «Действия» (Actions) нажмите «Создать...» (New):
- Действие: «Запуск программы» (Start a program)
- Программа или сценарий: wsl.exe
- Добавить аргументы: -u pen sudo service postgresql start && sudo service srv1cv83 start (Замените pen на имя вашего пользователя в WSL)
- На вкладке «Условия» (Conditions):
- Снимите флажок «Запускать только при питании от электросети» (Start the task only if the computer is on AC power), чтобы автозапуск работал на ноутбуках при работе от батареи.
- Нажмите OK и введите пароль вашей учетной записи Windows для подтверждения создания задачи.
Практическое задание
Цель работы: Избавиться от необходимости ручного ввода команд для старта окружения 1С и PostgreSQL при каждом запуске компьютера. Задание:
- ☐ Настройте конфигурационный файл /etc/sudoers в WSL для беспарольного выполнения команд управления службами СУБД и сервера 1С.
- ☐ Создайте фоновую задачу в планировщике задач Windows, инициализирующую запуск служб при загрузке ОС.
- ☐ Перезагрузите компьютер (хост-систему Windows).
- ☐ Проверка результата: Сразу после загрузки Windows (не открывая терминал Ubuntu вручную) запустите диспетчер задач Windows или ConEmu и выполните команду проверки процессов:
wsl -u pen top -b -n 1 | grep -E 'postgres|ragent'
В выводе вы должны увидеть стабильно работающие фоновые процессы postgres и ragent. Это означает, что ваше окружение полностью готово к работе в фоновом режиме сразу после старта Windows.
Проверьте себя
- Какую ошибку возвращает утилита systemctl при попытке управления службами в стандартном окружении WSL? Ответ: System has not been booted with systemd as init system (PID 1). Can't operate.. Это связано с тем, что WSL инициализирует систему через собственный легковесный init, а не полноценный systemd.
- Какая утилита используется в WSL в качестве альтернативы systemctl для ручного управления службами? Ответ: Утилита service (подсистема инициализации SysVinit).
- В чем состоят главные преимущества перехода на систему инициализации systemd, отмечаемые специалистами в комментариях? Ответ: Systemd значительно более функциональна, предоставляет встроенные механизмы логирования сетевой/системной активности и позволяет гибко мониторить состояние компонентов кластера.
- Зачем при настройке автозапуска служб через планировщик Windows требуется редактировать файл /etc/sudoers в Linux? Ответ: По умолчанию запуск служб через service требует прав суперпользователя (sudo), что вызывает интерактивный запрос пароля. Редактирование sudoers с флагом NOPASSWD позволяет планировщику Windows выполнять команды старта служб полностью в фоновом автоматическом режиме без ожидания ввода пароля.
- Каким образом подсистема WSL демонстрирует интеграцию ресурсов Windows и Linux при запущенных службах сервера 1С и СУБД? Ответ: Все запущенные в WSL процессы (такие как postgres и ragent) напрямую видны в стандартном диспетчере задач Windows, так как WSL является интегрированным программным слоем ОС Windows, делящим с ней ресурсы процессора, памяти и сети.
Попробовать НОПик →
Проверить свой уровень бесплатно →