自動起動の仕組みには手入れが必要

Linuxのバックグラウンドタスクとしてすぐに浮かんでくるのがcronデーモンだ。cronは指定されたスケジュールに従って指定されたプログラムを実行するデーモンで、Linuxを使った定期処理ではこのcronが使われることが多い。WSLでもバックグラウンドタスクがサポートされたのだから、まずcronを使えるようにしたいというのは当然の流れだ。

だが、WSLは初期化の仕組みが本来のディストリビューションと多少異なっており、cronを常に使おうとするならば多少の手入れが必要になる。礼えば、まずWSLでUbuntuを起動してみる。Windows 10からは次のようにbashが動作していることを確認できる。

Windows 10から見えるUbuntuの動作 - bash

少なくとも執筆時点のUbuntu on WSLはデフォルトではcronが自動動作しない仕組みになっている。手動でcronデーモンを起動するには、次のようにserviceコマンドでcronを実行させる。

手動でcronデーモンを起動

cronデーモンを起動したら、Windows 10からプロセスを確認する。次のように起動したcronデーモンをWindows 10側から確認できるはずだ。

起動したcronデーモンをWindows 10側から確認

これで準備完了、と思うかも知れない。確かに、Windows 10からはWSLコンソールウインドウを終了してもバックグラウンドタスクは動作し続けるので、この状態でWSLコンソールウインドウを終了してもcronデーモンは動作し続ける。ここまではよいのだが、Windows 10そのものを再起動すると、Ubuntu(WSL)を起動してもcronの起動は行われず、次のように動作していない状態に戻ってしまう。

Windows 10を再起動するとcronデーモンは起動しない状態に戻る

Windows 10にログインしたらcronも同時に動作してほしい。つまり、少なくとも次の2つの設定を行う必要がある。

  1. Windows 10にログオンしたらUbuntu(WSL)を自動的に起動する
  2. Ubuntu(WSL)が起動したらcronを自動的に起動する


上記2つの処理が機能すれば、ログインしたら必ずcronも動作するといった状況を作り出せる。そうなれば、cronは結構扱いやすいプログラムになる。

Linuxの自動起動とcronの自動起動

Linuxの自動起動はWindows 10の仕組みをそのまま使えばよい。Linuxを起動するコマンドへのショートカットを所定のフォルダに置けばそれで完了だ。

まず、それぞれのディストリビューションを起動するコマンドのパスを確認しよう。現状だと次のようになっている。

ディストリビューション パス
Ubuntu C:\WINDOWS\system32\bash.exe
Debian C:\Users\ユーザ名\AppData\Local\Microsoft\WindowsApps\debian.exe
Kali Linux C:\Users\ユーザ名\AppData\Local\Microsoft\WindowsApps\kali.exe
openSUSE Leap C:\Users\ユーザ名\AppData\Local\Microsoft\WindowsApps\openSUSE-42.exe
SUSE Linux Enterprise Server C:\Users\ユーザ名\AppData\Local\Microsoft\WindowsApps\SLES-12.exe

例えばUbuntuを自動起動するのであれば、「C:\WINDOWS\system32\bash.exe」をファイルエクスプローラで表示させ、ショートカットを作成する。Ubuntu以外のディストリビューションを使いたいなら、それぞれのコマンドのショートカットを作成する。

Ubuntuの場合はC:\WINDOWS\system32\bash.exeのショートカットを作成する

デスクトップに貼り付けたショートカット

ショートカットを設置するパスはファイルエクスプローラでたどるのが面倒なので、「ファイル名を指定して実行」を起動して「shell:startup」と入力してからOKボタンをクリックする。これでショートカットを設置すべきフォルダが表示される。

自動起動するプログラムを設置するフォルダを表示する方法

ここに先ほど作成したショートカットを移動させれば完了だ。次のようになっていればよい。

Ubuntu(WSL)をログオン時に自動起動する設定

次は、Ubuntu(WSL)起動時にcronデーモンを自動起動するための設定だ。cronデーモンは管理者権限で起動するのでsudoコマンドを使う必要があるが、sudoコマンドはパスワードの入力を求めてくる。毎回起動時にパスワードを入力するのが基本だが、一応、設定によってパスワード入力を不要にする方法はある。

sudoの設定は/etc/sudoersにある。この設定ファイルの「%sudo ALL=(ALL:ALL) ALL」といった設定行を次のように書き換えると、sudoを実行するときにパスワードが求められなくなる(より手軽には使えるようになるが、もちろんそれだけリスクは伴うので、くれぐれも注意されたい)。

■sudoコマンド実行時にパスワードを求められないように設定を変更

#%sudo  ALL=(ALL:ALL) ALL
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL

次にcronの自動起動だ。Ubuntu(WSL)の場合、$HOME/.bash_aliasesファイルがユーザー向けに用意されたプロファイルになるので、このファイルを作成して次の内容を書き込んでおく。

■作成する$HOME/.bash_aliasesファイルの中身

if ! service cron status > /dev/null 2>&1
then
        sudo service cron start > /dev/null 2>&1
fi

$HOME/.bash_aliasesファイルに書き込むのは「cronデーモンが起動していなければcronデーモンを起動する」という処理だ。これで準備完了である。

ここまでセットアップしたらWindows 10を再起動してログオンを行う。次のようにWSLコンソールウインドウが自動的に起動してくることを確認できる(このWSLコンソールウインドウは閉じておいても最小化しておいてもよい)。

Windows 10ログオン時に自動的にUbuntu (WSL)が起動する

この状態でWindows 10側からプロセスを確認するとcronデーモンが動作していることを確認できる。

Windows 10にログオンした状態でcronデーモンが動作していることを確認

もちろん、Ubuntu(WSL)側からプロセスを確認しても次のようにcronデーモンが動作していることを確認できる。

Ubuntu(WSL)からも当然cronの動作を確認できる

今回取り上げたのはUbuntu(WSL)の例だが、ほかのLinuxディストリビューションの場合にもほぼ同じような手順で同じ状態にできるので、お餅の方は試してみていただきたい。

もっと便利になりそうな予感

現段階ではこのように自分で設定に手を加える必要があるが、そう遠くないアップデートでこの辺りの設定も簡単に実施できるようになるのではないかと思う。WSLはWindowsを使っているデベロッパーにとって使いやすい環境なので、それに応えるかたちでディストリビューション側も何らかの機能を取り込むのではないだろうか。また、Microsoft側が何らかの取り組みを行うことも想像に難くない。

2018年春のWindows 10アップデートで実現したWSLのバックグラウンドタスク機能は、Linuxの能力を十分に発揮させるために欠かせないものだ。この機能が入ったことで、WSLの利用はまた1つ新しいステージに進んだと言える。