Linuxに限らずUNIX系のサーバでよく使う機能が「cron」だ。やりたいことをシェルスクリプトに書いておき、実行してほしいタイミングで実行されるようにcronにスケジュールを仕込んでおく。これをやりたいがためにUNIX系のサーバが欲しいというケースもあるだろう。

WSL(Windows Subsystem for Linux)のおかげで、「Windows 10 Fall Creators Update」以降はWindowsでもLinuxが実行できるのだから、ぜひこの環境でもcronを使いたい。もしここにいろいろ仕込んでおけるならば、さまざまな作業を手軽に自動化することができる。今回は、WSLでcronを使う手順について説明しよう。

WSLでcronを使う手順

まず、実行を確認するために簡単なスクリプトを作成する。

cronから実行させるサンプルスクリプト

このスクリプトは「年月日_時分秒」というファイルを/home/daichi/data/というディレクトリ以下に作成するものだ。1分ごとに起動すれば1分ごとにファイルが増えていくことになる。実行権限も与えておくことを忘れないようにしてほしい。

ユーザーレベルでcronを仕込むには「crontab -e」のようにcrontabコマンドを実行すればよい。エディタが起動してくるので、ここにスケジュールを追加していく。

crontab -eでスケジュールの編集状態に入る

最初は何も書き込まれていないので、例えば次のように1分ごとに作成したシェルスクリプトを実行するようにスケジュールを設定する。

1分ごとにmonitor.shを実行するようにスケジュールを追加

この場合、「*/1 * * * * /home/daichi/bin/monitor.sh」の設定で1分おきにスクリプトが実行されるようになる。しばらく待っていれば/home/daichi/data/の下に新しいファイルが1分おきに作成されて……いかない。cronでスケジュール通りに処理を進めるには、これを管理するcronデーモンが動作していなければならないのだが、デフォルトの状態ではこのデーモンは動作していない。そのため、「crontab -e」でスケジュールを書き込んだ後に「sudo service cron start」のようにしてcronを実行する必要がある。

この状態で初めて、cronによるスケジューリングが機能するようになる。

cronデーモンを起動するとcrontab -eで書き込んだスケジュール通りに処理が進み出す

これでWSLでもcronが利用できるのだが、ターミナルを全て終了してしまうと起動したcronデーモンも当然終了するため、追加したスケジュールは機能しなくなる。さらに、もう一度Ubuntuのターミナルを起動してもcronデーモンは起動してこないため、やはり追加したスケジュールは機能してくれない。

Ubuntuターミナルをすべて終了するとcronは機能しないし,再度Ubuntuターミナルを起動してもcronは起動していない状態になっている

MicrosoftがもともとWSLはサーバとして運用するような使い方は想定していないというように、ターミナルありきでの動作となっているため、サーバとして背後で動かし続けるというのは今のところできない。ターミナルを起動しておけばよいので、それでも構わないのであればこの使い方もありではないかと思う。

Ubuntu起動時にcronも起動するように~/.profileに追加する設定の例(最後の行)

なお、上記のように「pgrep cron > /dev/null || sudo service cron start」という設定を~/.profileの最後あたりに追加しておけば,Ubuntuを起動するごとにcronも実行することになるので、少なくともターミナルが生きている間はcronを動作させることができるようになる。

WSLはサーバとして使うケースは想定されていないので、Linuxサーバと同じような使い方をするのはちょっと無理がある(ただし、不可能ではない)。しかし、使いようによってはこれでも十分いける。WSLがもたらす可能性を見逃すのはあまりにも惜しい。WSLを使いこなし、Windowsに新たなパワーを持ち込んでほしいところだ。