Linuxに限らずUNIX系のサーバでよく使う機能が「cron」だ。やりたいことをシェルスクリプトに書いておき、実行してほしいタイミングで実行されるようにcronにスケジュールを仕込んでおく。これをやりたいがためにUNIX系のサーバが欲しいというケースもあるだろう。
WSL(Windows Subsystem for Linux)のおかげで、「Windows 10 Fall Creators Update」以降はWindowsでもLinuxが実行できるのだから、ぜひこの環境でもcronを使いたい。もしここにいろいろ仕込んでおけるならば、さまざまな作業を手軽に自動化することができる。今回は、WSLでcronを使う手順について説明しよう。
WSLでcronを使う手順
まず、実行を確認するために簡単なスクリプトを作成する。
このスクリプトは「年月日_時分秒」というファイルを/home/daichi/data/というディレクトリ以下に作成するものだ。1分ごとに起動すれば1分ごとにファイルが増えていくことになる。実行権限も与えておくことを忘れないようにしてほしい。
ユーザーレベルでcronを仕込むには「crontab -e」のようにcrontabコマンドを実行すればよい。エディタが起動してくるので、ここにスケジュールを追加していく。
最初は何も書き込まれていないので、例えば次のように1分ごとに作成したシェルスクリプトを実行するようにスケジュールを設定する。
この場合、「*/1 * * * * /home/daichi/bin/monitor.sh」の設定で1分おきにスクリプトが実行されるようになる。しばらく待っていれば/home/daichi/data/の下に新しいファイルが1分おきに作成されて……いかない。cronでスケジュール通りに処理を進めるには、これを管理するcronデーモンが動作していなければならないのだが、デフォルトの状態ではこのデーモンは動作していない。そのため、「crontab -e」でスケジュールを書き込んだ後に「sudo service cron start」のようにしてcronを実行する必要がある。
この状態で初めて、cronによるスケジューリングが機能するようになる。
これでWSLでもcronが利用できるのだが、ターミナルを全て終了してしまうと起動したcronデーモンも当然終了するため、追加したスケジュールは機能しなくなる。さらに、もう一度Ubuntuのターミナルを起動してもcronデーモンは起動してこないため、やはり追加したスケジュールは機能してくれない。
MicrosoftがもともとWSLはサーバとして運用するような使い方は想定していないというように、ターミナルありきでの動作となっているため、サーバとして背後で動かし続けるというのは今のところできない。ターミナルを起動しておけばよいので、それでも構わないのであればこの使い方もありではないかと思う。
なお、上記のように「pgrep cron > /dev/null || sudo service cron start」という設定を~/.profileの最後あたりに追加しておけば,Ubuntuを起動するごとにcronも実行することになるので、少なくともターミナルが生きている間はcronを動作させることができるようになる。
WSLはサーバとして使うケースは想定されていないので、Linuxサーバと同じような使い方をするのはちょっと無理がある(ただし、不可能ではない)。しかし、使いようによってはこれでも十分いける。WSLがもたらす可能性を見逃すのはあまりにも惜しい。WSLを使いこなし、Windowsに新たなパワーを持ち込んでほしいところだ。