WSL上のcronで時刻を定期的に修正する
はじめに
WSLはなぜか時計(システムクロック)がよく狂います。修正するためには、
sudo hwclock -s
を実行する必要があります。-s
は--hctosys
の短縮オプションで、システムクロックをハードウェアクロックに合わせるものです。で、これを毎回気が付いた時にやるのは面倒なので、cronで定期実行したいですね。でも、WSLはデフォルトでcronが動いていません。これをなんとかしましょう、という話です。
sudo hwclock
をパスワードなしに
まず、hwclock
によるハードウェアクロックへのアクセスにはroot権限が必要なので、sudo hwclock
する必要があります。すると、パスワードが要求されてしまいます。これではcronに載せられないので、パスワードなしに実行できるようにしましょう。事前にhwclock
のパスを調べておきます。
$ which hwclock
/sbin/hwclock
場合によって/usr/sbin/
だったりするようです(18から20に上げたりすると場所が違う?)。
次に/etc/sudoers
を編集します。編集に失敗するとsudo
コマンドが使えなくなって面倒なので、visudo
を使って修正すると良いでしょう。ファイルフォーマットが不正だと警告してくれるようになります。ただ、Ubuntuのデフォルトエディタはnanoなので、Vimを使いたい人は、あらかじめsudo apt purge nano
とかしておくと幸せかもしれません(crontab -e
なんかも同様)。
sudo visudo
そして、/etc/sudoers
の最後あたりに以下の行を追加します。
username ALL=NOPASSWD: /sbin/hwclock
username
は自分のアカウント名を入れてください。
sudo hwclock
を実行し、パスワードを聞かれなければ成功です。
cronの実行と設定
crondが起動しているか調べます。デフォルトでは動いていないと思います。
$ service cron status
* cron is not running
cronを起動しましょう。
$ sudo service cron start
* Starting periodic command scheduler cron
cronが起動したはずです。
$ service cron status
* cron is running
あとは適当な頻度、例えば10分おきぐらいにsudo hwclock -s
を実行してやればOKです。crontab -e
でcronを編集しましょう。
*/10 * * * * /sbin/hwclock -s
crondの起動
さて、WSLのcronは自動起動してくれないので、Windowsを再起動したらcronはまた止まってしまいます。バッチファイルに起動スクリプトを書いてスタートアップに入れてWindows起動時に自動実行させる方法もありますが、実行にroot権限が必要なものを勝手に起動させるのもちょっと気が引けます。そこで、ターミナル起動時にチェックして、起動してなければ実行する形式にしてみましょう。以下を.zshrc
に入れておきます。
if [[ -n `service cron status | grep not` ]];then
echo "cron is not running. Type password to run it."
sudo service cron start
fi
これで、ターミナルを起動時にcronが起動していなければパスワードが要求され、cronが起動します。
まとめ
WSLでcronを起動し、sudo hwclock -s
を定期実行させる環境を作ってみました。やったことは以下の通りです。
-
/etc/sudoers
を編集して、sudo hwclock
の実行にパスワードを不要にした - cronにコマンドを登録して
sudo hwclock -s
を定期実行させるようにした -
.zshrc
でサービスをチェックし、cronが実行していなければsudo service cron start
させるようにした
僕はターミナル起動時に一度だけパスワード入力するのは良いかな、と思いましたが、Windows起動時にcronを自動実行したい場合は以下の記事を参考にすると良いでしょう。
Discussion