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.

seanbw
źródło
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
Jaime
źródło
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.

w
źródło
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!

Beefjeff
źródło