Как заставить WSL запускать сервисы при запуске

3118
seanbw

После поиска этого сайта и различных вопросов, становится ясно, что сервисы и systemdнедоступны для WSL. Мне нужно запускать программу в WSL каждый раз, когда я запускаю свой компьютер, поэтому я прочитал эту страницу о том, как использовать crontab: Как запустить службу Ubuntu в Windows (при запуске)? Супер пользователь, но я запутался, потому что формат не соответствует формату в crontab.

Кроме того, этот конкретный вопрос был специфичен для серверов SSH, который требует, чтобы аспект безопасности, если он учитывался, и приводил к чрезмерному усложнению шагов. Независимо от того, шаги, исследованные в этом предложении, были опробованы, и они не сработали. Кроме того, этот вопрос очень специфичен для серверов SSH, тогда как этот вопрос касается общего экологического требования i. Мне нужно знать, КАК запускать службы в WSL (которые могут включать, но не ограничиваются серверами SSH)

По сути - требуется более упрощенное решение, чем Как запустить сервис Ubuntu в Windows (при запуске)? обеспечивает.

Однако это мой cron:

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin PATH=cd /usr/local/src/:cd xmr-stak-cpu:cd bin/ @reboot . sudo ./xmr-stak-cpu 

Я также сделал это:

Запустите цикл bash / cron при запуске

Создайте файл с именем linux.bat в оболочке: запуск

Paste: C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done' 

Это не работает.

Как я могу запустить сервис в WSL? Или есть способ использовать Windows?

Потому что в Windows я попробовал следующее: используя https://github.com/Microsoft/WSL/issues/612

Run: When the computer starts,  Action: Start a program,  Program: c:\Windows\system32\bash.exe,  Arguments: -c "sudo /xmr-stak-cpu/bin/xmr-stak-cpu -D" Start in: /usr/local/src/ 

И, как вы уже догадались, все равно не работает. Честно говоря, я хотел бы сделать это в WSL, потому что это мой предпочтительный путь, но я буду любым способом.

У меня есть рабочая станция с 96 ГБ ОЗУ, и поэтому я предпочитаю использовать ее в качестве компьютера с двумя Linux / Windows, а не моего маленького ноутбука.

У меня есть задачи как на Linux, так и на Windows, и я действительно нуждаюсь / предпочитаю решение для Linux, предоставляемое Windows.

Я рассмотрел другой вопрос, и есть пакет под названием Mysys, который, кажется, обеспечивает решение, однако это отличается от интеграции, обеспеченной Microsoft, которая была отличным способом продвижения вперед.

2
Возможный дубликат [Как запустить службу Ubuntu в Windows (при запуске)?] (Https://superuser.com/questions/1112007/how-to-run-ubuntu-service-on-windows-at-startup) Biswapriyo 5 лет назад 1
Это не возможный дубликат, а его расширение. Изученные в этом вопросе процедуры выходят далеко за рамки того, что мне нужно. Кроме того, это конкретный вопрос, который также относится к этому вопросу. Вы не читали этот вопрос, не так ли? seanbw 5 лет назад 1
Проверяя ваш вопрос, вы запускаете `sudo ... xmr-stak-cpu`, используя запланированное задание. - Вы запускали `visudo` и включали`% sudo ALL = NOPASSWD: / xmr-stak-cpu / bin / xmr-stak-cpu`, чтобы избежать проблем с командой, запрашивающей пароль? Вам (действительно) нужен судо? вы можете запустить майнер без привилегий sudo? Jaime 5 лет назад 0

2 ответа на вопрос

3
Jaime

В WSL дистрибутивы linux запускаются только после вызова первой команды linux. Если вы хотите запустить linux deamon (сервис), вы должны сконфигурировать сервер в linux и выполнить любую команду в этом дистрибутиве linux.

Есть много страниц и ответов, которые показывают, как создать скрипт для запуска WSL linux при запуске компьютера .

  • Существует сценарий wsl-autostart VBS, который вы можете использовать. Вы можете установить скрипт и изменить его commands.txtс помощью пользовательских команд Linux.
  • Существует пошаговое руководство для автоматического запуска сервера SSH на WSL.
  • Существуют также варианты создания политик для запуска программы в качестве начальных задач (с помощью gpedit.mscкоманды) или запланированной задачи, запускаемой при запуске (с помощью taskschd.msc).

ПРИМЕЧАНИЕ: если ваша программа должна выполняться с sudo, вы должны настроить ее для запуска программы без запроса пароля.

  • Запустите visudoв Linux и добавьте строку в конец файла:%sudo ALL=NOPASSWD: /full/path/to/program
Это может быть решением, которое я ищу. Я постараюсь посмотреть, смогу ли я взломать его seanbw 5 лет назад 0
Почему это было оштрафовано? seanbw 5 лет назад 0
+1 за скрипт wsl-autostart. Единственным недостатком является то, что это вызывает приглашение UAC при каждом запуске ...: / Inigo 5 лет назад 0
... так что я сделал это с помощью сценария wsl-autostart, но пропустил инструкции, которые говорят вам создать элемент автозагрузки в реестре. Вместо этого используйте Task Scheduler, чтобы создать задачу, которая запускает файл `start.vbs` при входе в систему с максимальными привилегиями пользователя. Теперь я могу запустить это, чтобы спокойно запускать службу cron в WSL каждый раз, когда я запускаю свою машину - работает как сон;) Inigo 5 лет назад 1
1
a.t.

Спасибо за ваш вопрос, он направил меня к этому решению. Это моё полное, обобщённое и частное решение. Он состоит из 3 шагов:

  1. Создать cronjob
  2. Запустить / включить службу cronjob при запуске
  3. Удалите запрос пароля для автоматического запуска службы cronjob.

На самом деле ваша проблема уже решена с помощью шагов 2 и 3, но, поскольку вы пытались сделать это с помощью cronjob, я также добавил этот шаг для полноты.

1. Создание работающего cronjob:

  1. Перейдите в папку /etc/
  2. Затем в папке /etc/введите:sudo nano crontab
  3. В этом файле с именем crontab введите вашу команду.
  4. Например: */1 * * * * root touch /var/www/myFile
  5. Чтобы создать файл с именем myFileв местоположении /var/www/каждую минуту.
  6. Для полноты: это */1 * * * * root touch /var/www/myFileбудет означать: создавать этот файл каждую первую минуту часа.

Пример crontabфайла может выглядеть следующим образом (я добавил только последнюю строку, остальное уже было в моей настройке):

# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do.  SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin  # m h dom mon dow user command */2 * * * * root touch /var/www/myFile 

2. Включение службы cronjob

Для автоматического запуска команды при запуске WSL Ubuntu 16.04 вы можете:

  1. CD для /home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. Затем текстовый редактор nano создает / открывает файл .bashrc
  4. В этом файле может быть показано много примеров, чтобы просто выполнить команду при запуске WSL Ubuntu 16.04, напишите свою команду в первой строке .bashrcфайла.
  5. Например: echo "hello world"как показано на рисунке ниже.
  6. Для вашей конкретной проблемы конкретным решением будет ввести строку:sudo ./xmr-stak-cpu
  7. Закройте редактор с помощью: ctrl+x
  8. Сохраните файл с Y
  9. Выход из убунту
  10. Перезапустите Ubuntu и убедитесь, что hello world напечатан перед вашим именем пользователя.

! [Пример команды в .bashrc, которая выполняется при загрузке ubuntu WSL.] 1

Например, это может выглядеть, как вы .bashrcвыглядите после того, как вы его отредактировали: (Я добавил только первую строку сверху, остальное уже было в моей настройке.)

sudo -i service cron start # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) # for examples  # If not running interactively, don't do anything case $- in *i*) ;; *) return;; esac  # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth  # append to the history file, don't overwrite it shopt -s histappend  # for setting history length see HISTSIZE and HISTFILESIZE in bash(1) HISTSIZE=1000 HISTFILESIZE=2000  # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. shopt -s checkwinsize  # If set, the pattern "**" used in a pathname expansion context will # match all files and zero or more directories and subdirectories. #shopt -s globstar  # make less more friendly for non-text input files, see lesspipe(1) [ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"  # set variable identifying the chroot you work in (used in the prompt below) if [ -z "$" ] && [ -r /etc/debian_chroot ]; then debian_chroot=$(cat /etc/debian_chroot) fi  # set a fancy prompt (non-color, unless we know we "want" color) case "$TERM" in xterm-color|*-256color) color_prompt=yes;; esac  # uncomment for a colored prompt, if the terminal has the capability; turned # off by default to not distract the user: the focus in a terminal window # should be on the output of commands, not on the prompt #force_color_prompt=yes  if [ -n "$force_color_prompt" ]; then if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then # We have color support; assume it's compliant with Ecma-48 # (ISO/IEC-6429). (Lack of such support is extremely rare, and such # a case would tend to support setf rather than setaf.) color_prompt=yes else color_prompt= fi fi 

Вы можете заменить hello worldкоманду на, sudo service cron startчтобы включить службу cronjob. Однако тогда вы все равно должны ввести свой пароль вручную.

3. Удаление подсказки для пароля: Использование: https://askubuntu.com/questions/147241/execute-sudo-without-password

  1. Откройте WSL Ubuntu 16.04 (терминал)
  2. sudo visudo
  3. Внизу файла добавьте строку: <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  4. Например, с именем пользователя zq вы должны добавить следующую строку в конец файла:
  5. zq ALL=(ALL) NOPASSWD: ALL
  6. Ctrl + X для выхода
  7. yс последующим <enter>сохранением.
  8. Затем снова закройте Ubuntu, снова откройте его и проверьте
  9. Служба cron запускается автоматически при загрузке / открытии WSL Ubuntu 16.04 без запроса пароля.
  10. (вы можете проверить с помощью команды:. sudo service cron status)

Например, код для предотвращения запроса пароля при загрузке будет выглядеть (я добавил только последнюю строку, остальное уже было в моей настройке):

# # This file MUST be edited with the 'visudo' command as root. # # Please consider adding local content in /etc/sudoers.d/ instead of # directly modifying this file. # # See the man page for details on how to write a sudoers file. # Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/s$ # Host alias specification  # User alias specification  # Cmnd alias specification  # User privilege specification root ALL=(ALL:ALL) ALL  # Members of the admin group may gain root privileges %admin ALL=(ALL) ALL  # Allow members of group sudo to execute any command %sudo ALL=(ALL:ALL) ALL  # See sudoers(5) for more information on "#include" directives:  #includedir /etc/sudoers.d %sudo ALL=NOPASSWD: /etc/init.d/cron zq ALL=(ALL) NOPASSWD: ALL 

Работая над этим решением, я узнал, что cronjobs предназначены для периодического запуска, а не для определенных событий, таких как запуск. Для запуска вещей при запуске в WSL вы можете использовать файл /home/<username>/.bashrc.

Скопируйте раздел из файла `.bashrc` в своем ответе, чтобы читатель узнал, как он выглядит после редактирования. Biswapriyo 5 лет назад 1
@Biswapriyo, спасибо за ваш отзыв. Сначала я добавил скриншот этого кода, но не смог заставить его работать. Поэтому я вставил фактический код. a.t. 5 лет назад 0