Como fazer o WSL executar serviços na inicialização

2

Depois de pesquisar este site e vários Q, fica claro que os serviços e systemd não estão disponíveis para o WSL. Eu preciso rodar um programa no WSL toda vez que eu inicio meu PC, então eu leio esta página sobre como usar o crontab: Como executar o serviço Ubuntu no Windows (na inicialização)? Super User, mas fiquei confuso porque o formato não corresponde ao formato no crontab.

Além disso, essa questão em particular era específica para servidores SSH, o que requer que o aspecto de segurança seja considerado e seja adequado, resultando em supercomplicação de etapas. Independentemente, os passos explorados nessa qusetion foram tentados e eles não funcionaram. Além disso, essa questão é altamente específica para servidores SSH, enquanto esta questão lida com uma exigência ambiental geral i. Preciso saber como executar serviços no WSL (que podem incluir, mas não se limitam a, serviços do SSH)

Com efeito: é necessária uma solução mais simplificada do que Como executar o serviço Ubuntu no Windows (na inicialização)? fornece.

No entanto, este é o meu 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

Eu também fiz isso:

Execute o loop bash / cron no início

Crie um arquivo chamado linux.bat no shell: startup

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

Não funciona.

Como posso executar um serviço no WSL? Ou existe uma maneira de usar o Windows?

Como no Windows, tentei o seguinte: usando o link

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/

E, como você adivinhou, ainda não funciona. Francamente, eu gostaria de poder fazer isso na WSL, porque é o meu caminho preferido, mas vou tomar de qualquer maneira.

Eu tenho uma estação de trabalho com 96GB de RAM e, como tal, prefiro usar isso como a máquina dual Linux / Windows e não meu laptop insignificante.

Eu tenho tarefas no Linux e no Windows e realmente preciso / prefiro a solução Linux fornecida pelo Windows.

Eu revi a outra pergunta e há um pacote chamado Mysys que parece fornecer uma solução, no entanto isso se afasta da integração fornecida pela Microsoft, que foi um ótimo caminho a seguir.

    
por seanbw 26.07.2018 / 17:24

2 respostas

3

No WSL, as distribuições linux são executadas somente após um primeiro comando linux ser invocado. Se você quer rodar um linux deamon (um serviço) você deve configurar o servidor no linux e rodar qualquer comando nessa distribuição linux.

Existem muitas páginas e respostas que mostram como criar um script para iniciar um linux de WSL quando seu computador for iniciado .

  • Existe um script VBS wsl-autostart que você pode usar. Você pode instalar o script e alterar o commands.txt com comandos personalizados do linux.
  • Existe um tutorial passo a passo para iniciar automaticamente um servidor ssh no WSL.
  • Também há opções para criar políticas para executar o programa como tarefas iniciais (usando o comando gpedit.msc ) ou uma tarefa agendada executada na inicialização (usando o taskschd.msc ).

NOTA: Se o seu programa deve ser executado com sudo , você deve configurá-lo para iniciar o programa sem pedir uma senha.

  • Execute visudo no linux e adicione uma linha no final do arquivo: %sudo ALL=NOPASSWD: /full/path/to/program
por 29.07.2018 / 04:42
1

Obrigado pela sua pergunta, ela me orientou para essa solução. Esta é a minha solução completa, generalizada e particular. Consiste em 3 etapas:

  1. Crie um cronjob
  2. Executar / ativar o serviço de tempo de execução na inicialização
  3. Remova a solicitação de senha para iniciar o serviço de tempo de execução automaticamente.

Na realidade, seu problema já está resolvido com apenas os passos 2 e 3, mas desde que você tentou fazer isso com um cronjob, eu também adicionei essa etapa para completar.

1. Criando um cronjob funcional:

  1. Navegue até a pasta /etc/
  2. Em seguida, na pasta /etc/ enter: sudo nano crontab
  3. Nesse arquivo chamado crontab, digite seu comando.
  4. Por exemplo: */1 * * * * root touch /var/www/myFile
  5. Para criar um arquivo chamado myFile na localização /var/www/ a cada minuto.
  6. Para a conclusão: */1 * * * * root touch /var/www/myFile significaria: criar esse arquivo a cada primeiro minuto da hora.

Um exemplo do arquivo crontab poderia parecer (eu adicionei somente a última linha, o resto já estava lá na minha configuração):

# /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. Ativando o serviço de tempo de execução

Para executar um comando automaticamente na inicialização do WSL Ubuntu 16.04, você pode:

  1. cd para /home/<your ubuntu user name>
  2. sudo nano .bashrc
  3. O editor de texto nano cria / abre um arquivo .bashrc
  4. Nesse arquivo, muitos exemplos já podem ser mostrados, para apenas executar o seu comando na inicialização do WSB ubuntu 16.04, escreva seu comando na primeira linha do arquivo .bashrc .
  5. Por exemplo: echo "hello world" como mostrado na figura abaixo.
  6. Para o seu problema específico, a solução específica seria inserir a linha: sudo ./xmr-stak-cpu
  7. Feche o editor com: ctrl+x
  8. Salve o arquivo com Y
  9. Saia do Ubuntu
  10. Reinicie o Ubuntu e verifique se o mundo hello foi impresso antes do seu nome de usuário.

! [Um exemplo de comando no .bashrc que é executado na inicialização do WSL     ubuntu.] 1

Por exemplo, este pode ser o seu .bashrc depois que você o editou: (Eu só adicionei a primeira linha no topo, o resto já estava lá na minha configuração.)

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

Você pode substituir o comando hello world por sudo service cron start para ativar o serviço de tempo de execução. No entanto, você ainda precisará inserir sua senha manualmente.

3. Removendo o prompt de senha: Usando: link

  1. Abra o WSB ubuntu 16.04 (terminal)
  2. sudo visudo
  3. Na parte inferior do arquivo, adicione a linha: %código%
  4. Por exemplo, com o nome de usuário zq, você adicionaria a seguinte linha à parte inferior do arquivo:
  5. <your WSL ubuntu username> ALL=(ALL) NOPASSWD: ALL
  6. ctrl + x para sair
  7. zq ALL=(ALL) NOPASSWD: ALL seguido por y para salvar.
  8. Então, novamente, feche o Ubuntu e abra-o novamente e verifique
  9. O serviço cron está sendo executado automaticamente quando você inicializa / abre o WSL ubuntu 16.04 sem solicitar senha.
  10. (você pode verificar com o comando: <enter> .)

O código para evitar a solicitação de senha na inicialização seria, por exemplo, parecido com (eu adicionei apenas a última linha, o resto já estava lá na minha configuração):

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

Trabalhando para essa solução, eu aprendi que os cronjobs são destinados a que as coisas sejam executadas periodicamente, e não em eventos específicos, como a inicialização. Para executar as coisas na inicialização do WSL, você pode usar o arquivo sudo service cron status .

    
por 11.10.2018 / 19:38