WSL(Windows Subsystem for Linux)では、少なくとも1つはコンソールウインドウが起動していないとプロセスが動かないため、cronのようなスケジュール機能を使おうとしても思ったようには動かない。動作させるならば常にコンソールウインドウをどこかで開いておき、かつ、cronを実行しておく必要がある。

そのため前回は、Ubuntuのコンソールウインドウ起動時にcronデーモンを起動するように設定を追加する方法を説明した。次のような設定を~/.profileに書き込んでおけば、最初のコンソールウインドウを起動するときに(半手動的ではあるが)cronデーモンを起動できる。

pgrep cron > /dev/null || sudo service cron start

しかし本稿執筆と同じタイミングで、Microsoftから将来的にWSLにバックグラウンドタスク機能を追加する予定だという発表が行われた。以下にMicrosoftのブログ「Background Task Support in WSL」から一部を引用するが、これはなかなか驚きの発表だ。

Starting in Windows Insiders Build 17046, WSL supports background tasks (including daemons). …略… these processes will continue running in the background even after the last console window has been closed.

出典:Background Task Support in WSL

筆者意訳:Windows Insiders Build 17046から、WSLにおいて(デーモンも含めた)バックグラウンドタスクのサポートを開始する。 …略… これらのプロセスは、たとえ最後のコンソールウインドウが終了した後でもバックグラウンドで動作を継続する。

Windows Insider Build 17046から実験的にWSLにおけるバックグラウンドタスクが利用できるようになるとされている。つまり、Windows 10にログインするタイミングでWSLが自動的に起動され指定したデーモンを起動させることができるようになるということだ。どのデーモンが対象になるのかといった細かい切り分けは今後の要望を受けて決めているようだが、cronも対象として扱われるのではないかと思う。

つまり、遅くても1年後のWindows 10アップデート以降は,タスクスケジュールにWSLのデーモンを指定できるようになる可能性があるというわけだ。

Windows 10タスクスケジュール

Windows 10タスクマネージャー

Linuxディストリビューションが採用しているサービス起動制御のプログラムとWindowsのタスクスケジュールがどのように関連を持つことになるのかは今後の開発(というかユーザーの要望)次第ということになるが、もっとシームレスに結び付く可能性もある。Ubuntu側のサービス管理システムにのっとって設定したサービスがそのままWindows 10ログオン時に起動してくるようになるかもしれない。

Microsoftは発表のなかで、「tmux」で擬似ターミナルを用意していったん接続を解除し、再び「tmux」で擬似ターミナルに接続に行くと、Linuxを使っているときのようにちゃんと再接続できるようになるという動作例を紹介している。現在のWSLではtmux自体が終了してしまうためこういうことはできないのだが、現在開発中のWindows 10ではできるようになっているという。

tmuxで作成した擬似ターミナルでhtopを動作させておく(左)。いったん終了させてから、再接続を試みる(中央)。再接続が成功する(右)/出典:Background Task Support in WSL

WSLのバックグラウンドタスク対応は、Windowsにとって大きな利点になる。これでWindowsを使いながら、これまでLinuxサーバやLinuxデスクトップを使って開発していたような作業をこなすことができるようになるからだ。Microsoftは不本意かも知れないが、Windows 10のWSLでサーバを運用することもできるようになる可能性がある。そこまでになるにはまだ足りないものも多いのだが、WindowsがLinuxサーバに対抗する材料にはなりそうだ。バックグラウンドタスクに関しては、またWSLが正式に対応した段階でくわしく取り上げたい。