2

После поиска этого сайта и различных вопросов, становится ясно, что services и 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 ответа2

3

В 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
1

Спасибо за ваш вопрос, он направил меня к этому решению. Это моё полное, обобщённое и частное решение. Он состоит из 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. перейдите в /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, которая выполняется при загрузке WSL Ubuntu.]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 "${debian_chroot:-}" ] && [ -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 .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .