Jak uruchomić usługi WSL podczas uruchamiania


3

Po przeszukiwaniu tej witryny i różnych Q jest jasne, że usługi i systemdnie są dostępne dla WSL. Muszę uruchomić program w WSL przy każdym uruchomieniu komputera, więc przeczytałem tę stronę na temat używania crontab: Jak uruchomić usługę Ubuntu w systemie Windows (przy starcie)? Super użytkownik, ale pomyliłem się, ponieważ format nie zgadza się z formatem w crontab.

Ponadto to konkretne pytanie było specyficzne dla serwerów SSH, które wymagają uwzględnienia aspektu bezpieczeństwa, a co za tym idzie, nadmiernej komplikacji kroków. Niezależnie od tego, kroki badane w tym okresie zostały wypróbowane i nie zadziałały. Ponadto pytanie to jest bardzo specyficzne dla serwerów SSH, podczas gdy to pytanie dotyczy ogólnego wymogu ochrony środowiska. Muszę wiedzieć JAK uruchomić usługi w WSL (które mogą obejmować między innymi serwery SSH)

W efekcie - wymagane jest bardziej uproszczone rozwiązanie niż Jak uruchomić usługę Ubuntu w systemie Windows (przy starcie)? zapewnia.

Jednak to jest mój 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

Zrobiłem to również:

Uruchom pętlę bash / cron na starcie

Utwórz plik o nazwie linux.bat w powłoce: startup

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

To nie działa.

Jak mogę uruchomić usługę w WSL? Czy istnieje sposób na korzystanie z systemu Windows?

Ponieważ w systemie Windows próbowałem: za pomocą 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/

Jak się domyślacie, nadal nie działa. Szczerze mówiąc, chciałbym to zrobić w WSL, ponieważ jest to moja preferowana droga, ale w dowolny sposób.

Mam stację roboczą z 96 GB pamięci RAM i jako taki wolę używać tego jako podwójnego komputera z systemem Linux / Windows, a nie mojego słabego laptopa.

Mam zadania zarówno w systemie Linux, jak i Windows, i naprawdę potrzebuję / wolę rozwiązanie Linuxowe dostarczane przez Windows.

Przejrzałem inne pytanie i jest pakiet o nazwie Mysys, który wydaje się zapewniać rozwiązanie, ale to odbiega od integracji dostarczonej przez Microsoft, która była świetnym rozwiązaniem.



1
NIE jest to możliwy duplikat, ale jego rozszerzenie. Przebadane w tym pytaniu procedury wykraczają poza to, czego potrzebuję. Ponadto jest to specyficzne pytanie, które odnosi się również do tego pytania. Nie przeczytałeś tego pytania, prawda?
— seanbw

Sprawdzając swoje pytanie, sudo ... xmr-stak-cpukorzystasz z zaplanowanego zadania. - Czy uruchomiłeś visudoi uwzględniłeś, %sudo ALL=NOPASSWD: /xmr-stak-cpu/bin/xmr-stak-cpuaby uniknąć problemów z poleceniem proszącym o hasło? Czy naprawdę potrzebujesz sudo? możesz uruchomić górnika bez przywilejów sudo?
— Jaime

Odpowiedzi:


3

W WSL dystrybucje Linuksa działają tylko po wywołaniu pierwszego polecenia linux. Jeśli chcesz uruchomić linux deamon (usługę), musisz skonfigurować serwer w Linuksie i uruchomić dowolne polecenie w tej dystrybucji Linuksa.

Istnieje wiele stron i odpowiedzi, które pokazują, jak utworzyć skrypt do uruchomienia linuksowego WSL podczas uruchamiania komputera .

  • Istnieje skrypt VBS wsl-autostart , którego można użyć. Możesz zainstalować skrypt i zmienić commands.txtniestandardowe polecenia linux.
  • Istnieje samouczek krok po kroku, aby automatycznie uruchomić serwer ssh na WSL.
  • Istnieją również opcje tworzenia zasad, aby uruchomić program jako zadania początkowe (za pomocą gpedit.mscpolecenia) lub zaplanowane zadanie uruchamiane podczas uruchamiania (za pomocą taskschd.msc).

UWAGA: Jeśli twój program musi być sudouruchomiony, musisz go skonfigurować, aby uruchomić program bez pytania o hasło.

  • Uruchom visudow systemie Linux i dodaj wiersz na końcu pliku:%sudo ALL=NOPASSWD: /full/path/to/program

To może być rozwiązanie, którego szukam. Postaram się sprawdzić, czy mogę to
— zhakować

Dlaczego było to karane?
— seanbw

+1 dla skryptu wsl-autostart. Jedynym minusem jest to, że uruchamia się monit UAC przy każdym uruchomieniu ...: /
— Inigo

1
... więc w ten sposób użyłem skryptu wsl-autostart, ale pomiń instrukcje, które podpowiadają ci, aby utworzyć element startowy w rejestrze. Zamiast tego użyj Harmonogramu zadań, aby utworzyć zadanie, które uruchamia start.vbsplik przy logowaniu z maksymalnymi uprawnieniami użytkownika. Mogę teraz uruchomić to, aby cicho uruchomić usługę cron w WSL za każdym razem, gdy uruchamiam moją maszynę - działa jak sen;)
— Inigo

1

Dziękuję za pytanie, które doprowadziło mnie do tego rozwiązania. To jest moje kompletne, uogólnione i szczególne rozwiązanie. Składa się z 3 kroków:

  1. Stwórz cronjob
  2. Uruchom / włącz usługę cronjob przy starcie
  3. Usuń monit o hasło, aby automatycznie uruchomić usługę cronjob.

W rzeczywistości twój problem został już rozwiązany tylko za pomocą kroku 2 i 3, ale ponieważ próbowałeś zrobić to za pomocą cronjob, dodałem również ten krok dla kompletności.

1. Tworzenie działającego zadania cron:

  1. Przejdź do folderu /etc/
  2. Następnie w folderze /etc/wprowadź:sudo nano crontab
  3. W tym pliku o nazwie crontab wprowadź swoje polecenie.
  4. Na przykład: */1 * * * * root touch /var/www/myFile
  5. Aby utworzyć plik nazwany myFilew lokalizacji /var/www/co minutę.
  6. Kompletność: */1 * * * * root touch /var/www/myFileoznaczałoby: tworzenie tego pliku co 1 minutę godziny.

Przykład crontabpliku może wyglądać (dodałem tylko ostatnią linię, reszta była już w mojej konfiguracji):

# /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. Włączanie usługi cronjob

Aby automatycznie uruchomić polecenie podczas uruchamiania WSL Ubuntu 16.04, możesz:

  1. cd do /home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. Edytor tekstu nano tworzy / otwiera plik .bashrc
  4. W tym pliku można już pokazać wiele przykładów, aby po prostu uruchomić polecenie po uruchomieniu WSL ubuntu 16.04, wpisz polecenie w pierwszym wierszu .bashrcpliku.
  5. Na przykład: echo "hello world"jak pokazano na rysunku poniżej.
  6. W przypadku konkretnego problemu, szczególnym rozwiązaniem byłoby wprowadzenie linii:sudo ./xmr-stak-cpu
  7. Zamknij edytor za pomocą: ctrl+x
  8. Zapisz plik za pomocą Y
  9. Wyjdź z ubuntu
  10. Uruchom ponownie ubuntu i sprawdź, czy świat hello jest wydrukowany przed nazwą użytkownika.

! [Przykładowa komenda w .bashrc, która jest wykonywana podczas uruchamiania WSL ubuntu.] 1

Na przykład może to być to, .bashrcjak wygląda Twój wygląd po edycji: (Dodałem tylko pierwszą linię na górze, reszta była już w mojej konfiguracji).

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

Możesz zastąpić hello worldpolecenie, sudo service cron startaby włączyć usługę cronjob. Jednak nadal musisz ręcznie wprowadzić hasło.

3. Usuwanie pytania o hasło: Używając: https://askubuntu.com/questions/147241/execute-sudo-without-password

  1. Otwórz WSL ubuntu 16.04 (terminal)
  2. sudo visudo
  3. Na dole wiersza dodawania plików: <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  4. Np. Przy użyciu nazwy użytkownika zq dodajesz następujący wiersz na dole pliku:
  5. zq ALL=(ALL) NOPASSWD: ALL
  6. ctrl + x, aby wyjść
  7. ynastępnie, <enter>aby zapisać.
  8. Następnie ponownie zamknij ubuntu i otwórz je ponownie i sprawdź
  9. Usługa cron działa automatycznie po uruchomieniu / otwarciu WSL ubuntu 16.04 bez pytania o hasło.
  10. (możesz to sprawdzić poleceniem:. sudo service cron status)

Kod uniemożliwiający monitowanie o hasło przy rozruchu wyglądałby na przykład (dodałem tylko ostatnią linię, reszta była już w mojej konfiguracji):

#
# 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

Pracując nad tym rozwiązaniem, dowiedziałem się, że cronjobs są przeznaczone do okresowego uruchamiania rzeczy, a nie do określonych zdarzeń, takich jak uruchamianie. Aby uruchomić rzeczy podczas uruchamiania w WSL, możesz użyć pliku /home/<username>/.bashrc.


1
Skopiuj sekcję z .bashrcpliku w odpowiedzi, aby czytelnik dowiedział się, jak wygląda po edycji.
— Biswapriyo

@Biswapriyo, dziękuję za Twoją opinię. Początkowo dodałem zrzut ekranu tego kodu, ale nie udało się go uruchomić. Więc wkleiłem rzeczywisty kod.
— w

0

Pobierz to -> https://github.com/troytse/wsl-autostart

I zamiast postępować zgodnie z instrukcjami dotyczącymi konfiguracji w rejestrze / polityce grupy / taskschd, po prostu upuść skrót do start.vbsfolderu startowego:

"C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"

Lub folder startowy systemu

"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"

Działa świetnie!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.