自動起動の仕組みには手入れが必要
Linuxのバックグラウンドタスクとしてすぐに浮かんでくるのがcronデーモンだ。cronは指定されたスケジュールに従って指定されたプログラムを実行するデーモンで、Linuxを使った定期処理ではこのcronが使われることが多い。WSLでもバックグラウンドタスクがサポートされたのだから、まずcronを使えるようにしたいというのは当然の流れだ。
だが、WSLは初期化の仕組みが本来のディストリビューションと多少異なっており、cronを常に使おうとするならば多少の手入れが必要になる。礼えば、まずWSLでUbuntuを起動してみる。Windows 10からは次のようにbashが動作していることを確認できる。
少なくとも執筆時点のUbuntu on WSLはデフォルトではcronが自動動作しない仕組みになっている。手動でcronデーモンを起動するには、次のようにserviceコマンドでcronを実行させる。
cronデーモンを起動したら、Windows 10からプロセスを確認する。次のように起動したcronデーモンをWindows 10側から確認できるはずだ。
これで準備完了、と思うかも知れない。確かに、Windows 10からはWSLコンソールウインドウを終了してもバックグラウンドタスクは動作し続けるので、この状態でWSLコンソールウインドウを終了してもcronデーモンは動作し続ける。ここまではよいのだが、Windows 10そのものを再起動すると、Ubuntu(WSL)を起動してもcronの起動は行われず、次のように動作していない状態に戻ってしまう。
Windows 10にログインしたらcronも同時に動作してほしい。つまり、少なくとも次の2つの設定を行う必要がある。
- Windows 10にログオンしたらUbuntu(WSL)を自動的に起動する
- 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以外のディストリビューションを使いたいなら、それぞれのコマンドのショートカットを作成する。
ショートカットを設置するパスはファイルエクスプローラでたどるのが面倒なので、「ファイル名を指定して実行」を起動して「shell:startup」と入力してからOKボタンをクリックする。これでショートカットを設置すべきフォルダが表示される。
ここに先ほど作成したショートカットを移動させれば完了だ。次のようになっていればよい。
次は、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側からプロセスを確認するとcronデーモンが動作していることを確認できる。
もちろん、Ubuntu(WSL)側からプロセスを確認しても次のようにcronデーモンが動作していることを確認できる。
今回取り上げたのはUbuntu(WSL)の例だが、ほかのLinuxディストリビューションの場合にもほぼ同じような手順で同じ状態にできるので、お餅の方は試してみていただきたい。
もっと便利になりそうな予感
現段階ではこのように自分で設定に手を加える必要があるが、そう遠くないアップデートでこの辺りの設定も簡単に実施できるようになるのではないかと思う。WSLはWindowsを使っているデベロッパーにとって使いやすい環境なので、それに応えるかたちでディストリビューション側も何らかの機能を取り込むのではないだろうか。また、Microsoft側が何らかの取り組みを行うことも想像に難くない。
2018年春のWindows 10アップデートで実現したWSLのバックグラウンドタスク機能は、Linuxの能力を十分に発揮させるために欠かせないものだ。この機能が入ったことで、WSLの利用はまた1つ新しいステージに進んだと言える。