WSLは起動時にサービスを実行します。

WSLは起動時にサービスを実行します。

これがWSLの問題なのか、Ubuntuに問題があるのか​​正直にはわかりませんが、WSLシステムの起動時にcronサービスを実行することはできません。

うまく始まります:

sudo service cron start

ただし、次回以降も起動時に起動しません。

sudo update-rc.d cron defaults
sudo update-rc.d cron enable

バージョン:

$ uname -a
Linux PC-01 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.4 LTS
Release:        18.04
Codename:       bionic

答え1

今質問した他の質問の潜在的な「重複」を検索している間に見つけたばかりの古い質問です。 「wsl start services」の最初の検索結果なので、ここに答えを入力します。

一つある現在の答えて未来回答(現在利用可能なWSL Windows 10/11プレビュー基準)

現在の答えは、WSLには「サービスの開始」という概念がないということです。 Microsoftのinitプロセスは、「一般的な」Linuxシステムのように、SysVinitもSystemd initでもありません。

サービスを自動的に開始するには、次のものがあります。これを達成するには2つの方法があり、3番目の方法は次のWSLバージョンで利用できます。


  • オプション1:起動時ではなくログイン時に実行されるようにWindowsスケジュールジョブを設定する:

    • ジョブは「基本ジョブ」であってもよい。
    • 「プログラムの開始」
    • 「計画」はwsl.exe
    • そして「主張」は次のようにする必要があります-u root service cron start

    これにより、サービスの開始に必要なWSLが実行され、rootとしてログインしている間にコマンドが実行されますservice cron start。もちろん、init.dスクリプトを使用してすべてのサービスを実行するように変更できます。 Windowsの起動時にジョブが実行されるようにスケジュールする場合、この方法は(少なくとも今では)機能しません。 WSLは、プロセスをバックグラウンドで実行し続けるには、ユーザーがログインする必要があるように見えるためです。


  • オプション2:シェルの起動を変更してサービスが実行されていることを確認し、必要に応じて起動します。

    起動時に~/.bashrc(通常)次の行を追加します。

    wsl.exe -u root sh -c "service cron status || service cron start"
    

    「一般」Linuxでは、visudoパスワードなしでコマンドを実行する(またはログインするたびにパスワードを入力するために)権限が必要であり、自分に権限を付与する必要があります。wsl.exe -u root以下で使用以内にWSLを使用すると、これをバイパスできます。


  • オプション3: Windows 11の新機能は、この/etc/wsl.confファイルを使用してWSLの起動操作を指定する機能です。 Windows 11を使用している場合は、次の行を使用してファイルを作成します。

    [boot]
    command="service cron start"
    

    ~によるとマイクロソフト文書、WSLインスタンスの起動時にrootとしてコマンドを実行します。

    WSLの起動時に複数のコマンドを実行する必要がある場合は、command同じ行からセミコロンで区切ります。

    [boot]
    command="service ssh start; service cron start"
    

答え2

この投稿は私が望むものを得るのに役立ちましたが、複数のコマンド(xrdpの起動、eth0 mtuの調整、resolv.confの更新)を実行する必要があり、複数回実行すると複数のルートログインがwsl.exeインスタンス化され、ファイルロックが発生します。いくつかの問題があります。resolv.confそれはおそらくWSLによるものです。ログインするたびに何かを設定しますが、肯定的ではありません。

私はwsl2カーネルバージョンの5.10.102.1 Windows 10とUbuntu 20.04.5 LTSを使用しています。私の必要性

  1. xrdpを起動します(GUIセッションに接続できるように)。
  2. eth0 mtuを1350に設定します(WSLはmtuのためにVPNを使用するときに接続に問題があります)。
  3. アップストリームリゾルバを使用して更新されます(resolv.confinに関係なくWSLを介して継続的に更新されます)generateResolvConf = falsewsl.config

だから私がしたことは@NotTheDr01dsの答えを拡張したことです。

  1. .mystartup.shすべてのコマンドをホームディレクトリの新しいシェルスクリプトに入れます。
  2. .mystartup.shルートとして呼び出す.profile

私が追加したものです.profile

# startup stuff
# run startup script as root
wsl.exe -u root /home/user/.mystartup.sh

これは.mystartup.sh

# startup stuff
# service xrdp start
service xrdp status || service xrdp start

# setup lower mtu for vpn links
ifconfig eth0 mtu 1350
echo "eth0 mtu updated!"

# remove link to /run/resolvconf/resolv.conf & create new
rm -f /etc/resolv.conf
touch /etc/resolv.conf
chmod u+rwx,g+rwx,o+rx /etc/resolv.conf

# setup nameservers
echo "# this resolv.conf created using user .profile script" >> /etc/resolv.conf
echo "# wsl auto-generate must be disabled in /etc/wsl.config" >> /etc/resolv.conf
echo "nameserver 10.0.0.50" >> /etc/resolv.conf
echo "nameserver 10.0.0.51" >> /etc/resolv.conf
echo "resolv.conf modified with custom dns resolvers!"
echo

関連情報