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 つの方法があり、次の WSL リリースでは 3 つ目の方法が提供されます。


  • オプション 1: ログイン時 (起動時ではない) に実行される Windows の「スケジュールされたタスク」を設定します。

    • タスクは「基本タスク」として
    • 「プログラムを開始する」
    • 「プログラム」とはwsl.exe
    • そして「引数」は-u root service cron start

    これにより、ルート ユーザー (サービスを開始するために必要) としてログインすると WSL が実行され、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 の新機能として、ファイルを使用して WSL のスタートアップ タスクを指定できるようになりました/etc/wsl.conf。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. アップストリームリゾルバで更新する( inresolv.confに関係なく 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

関連情報