web-dev-qa-db-ja.com

起動時にWSLにサービスを実行させる方法

このサイトとさまざまなQを検索した後、サービスとsystemdがWSLで利用できないことは明らかです。 PCを起動するたびにWSLでプログラムを実行する必要があるため、crontabの使用方法について次のページを読みます。 WindowsでUbuntuサービスを実行する方法(起動時) スーパーユーザーですが、混乱しましたこのフォーマットはcrontabのフォーマットと一致しないためです。

さらに、その特定の質問はSSHサーバーに固有のものであり、SSHサーバーでは、セキュリティの側面を考慮して対処すると、手順が複雑になりすぎます。いずれにせよ、そのQusetionで検討されたステップは試されており、機能しませんでした。さらに、この質問はSSHサーバーに非常に特有ですが、この質問は一般的な環境要件iを扱います。 WSLでサービスを実行する方法を知る必要があります(SSHサーバーを含む場合がありますが、これに限定されません)

実際には、 WindowsでUbuntuサービスを実行する方法(起動時)? よりも簡単なソリューションが必要です。

しかし、これは私の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ループを実行する

Shell:startupに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でこれを実行できればいいのにと思っていますが、私はどんな方法でもとります。

私は96GBのワークステーションを持っていますRAM=したがって、私はこれを私のLinux/Windowsデュアルマシンとして使用し、私のラップトップのラップトップとしては使用しません。

LinuxとWindowsの両方でタスクを実行しており、Windowsが提供するLinuxソリューションを本当に必要としています。

私は他の質問を確認しましたが、解決策を提供するように見えるMysysと呼ばれるパッケージがありますが、これはMicrosoftによって提供された統合とは異なり、これは素晴らしい方法でした。

18
seanbw

WSLでは、Linuxディストリビューションは、最初のLinuxコマンドが呼び出された後にのみ実行されます。 Linuxデーモン(サービス)を実行する場合は、サーバーをLinuxで構成し、そのLinuxディストリビューションでコマンドを実行する必要があります。

コンピュータの起動時にWSL linuxを起動するスクリプトを作成する方法 を示すページと回答がたくさんあります

  • 使用できる wsl-autostart VBSスクリプト があります。スクリプトをインストールし、カスタムLinuxコマンドを使用してcommands.txtを変更できます。
  • WSLでsshサーバーを自動的に起動する ステップバイステップチュートリアル があります。
  • プログラムを初期タスク(gpedit.mscコマンドを使用)または実行時にスケジュールされたタスク(taskschd.mscを使用)として実行するポリシーを作成するオプションもあります。

注:プログラムをSudoで実行する必要がある場合は、パスワードを要求せずにプログラムを起動するようにプログラムを構成する必要があります。

  • Linuxでvisudoを実行し、ファイルの最後に次の行を追加します:%Sudo ALL=NOPASSWD: /full/path/to/program
10
Jaime

ご質問ありがとうございます。この解決策に導いてくれました。これは私の完全で一般化された特定のソリューションです。 3つのステップで構成されています。

  1. Cronジョブを作成する
  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. 毎分、場所_/var/www/_にmyFileという名前のファイルを作成します。
  6. 完全を期すには、_*/1 * * * * root touch /var/www/myFile_は、1時間ごとにそのファイルを作成することを意味します。

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 to _/home/<your ubuntu user name>_
  2. _Sudo nano .bashrc_
  3. 次に、テキストエディタnanoがファイルを作成/開きます_.bashrc_
  4. そのファイルには多くの例がすでに示されています。WSLubuntu 16.04の起動時にコマンドを実行するには、_.bashrc_ファイルの最初の行にコマンドを記述します。
  5. 例:_echo "hello world"_下の図に示すように。
  6. 特定の問題の場合、特定の解決策は次の行を入力することです:_Sudo ./xmr-stak-cpu_
  7. _ctrl+x_でエディターを閉じます
  8. Yでファイルを保存します
  9. Ubuntuを終了する
  10. Ubuntuを再起動し、ユーザー名の前にhello worldが表示されていることを確認してください。

![WSL ubuntuの起動時に実行される.bashrcのコマンド例]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_ commandを_Sudo service cron start_に置き換えて、cronjobサービスを有効にすることができます。ただし、その場合でも、手動でパスワードを入力する必要があります。

3。パスワードのプロンプトを削除:使用: https://askubuntu.com/questions/147241/execute-Sudo-without-password

  1. Open 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. パスワードを要求せずにWSL ubuntu 16.04を起動/開くと、cronサービスが自動的に実行されます。
  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_を使用できます。

4
a.t.

これをダウンロード-> https://github.com/troytse/wsl-autostart

レジストリ/グループポリシー/ taskschdで設定する手順に従う代わりに、スタートアップフォルダーにstart.vbsのショートカットをドロップするだけです。

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

またはシステム起動フォルダ

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

よく働く!

2
Beefjeff

MySQLサービスの私の例

  1. /etc/sudoers.d/に行を作成します(WSLでパスワードを要求しないようにします)。

    %Sudo   ALL=(ALL) NOPASSWD: /usr/sbin/service mysql *
    
  2. 次の行を使用して、Windowsスタートアップディレクトリに.batファイルを作成します(dir find here: Win+R およびShell:startup):

    wsl Sudo service mysql start
    

サービスを再起動すると、自動的に開始されます。

1
user1126880