Wake On Lan
PC を定期的に起動・終了したく、試しました。
指定時間で停止
$ sudo crontab -e
MM HH * * * /sbin/shutdown -h now
まあ、普通ですね。歴史的に(?) localtime での時間設定らしいので、気をつける。
起動時にしか localtime をチェックしないので、起動後に localtime を変更する場合は、 cron を再起動しておく。
sudo service cron restart
指定時間で起動
Wake On Lan の magic packet を投げる方法はいくつもあると思いますが、nodejs に慣れているのでそれを選びます。
依存ライブラリのインストール
npm init
npm install --local --save wake_on_lan cron forever
- wake_on_lan 名前通り
- cron 時間で指定して実行
- forever おてがるデーモン化
テスト
ひとまず実行してみる。
const wol = require('wake_on_lan');
wol.wake('xx:xx:xx:xx:xx:xx');
起動する。楽だ。LAN が複数ポートある場合は、一つ目にしか飛ばないのか起動しなかったのでオプションをつける。
wol.wake(mac, { address : '192.168.xx.255' });
動かない場合は sudo tcpdump -nX udp and port 9 等で対象と同じネットワークから見てみる。
結果
最終的には、設定を外出ししてこんな感じに。
ソースファイル
'use strict';
const wol = require('wake_on_lan');
const config = require('./config.js');
function kick() {
config.hosts.forEach(host => {
wol.wake(host, config.wol);
});
};
const CronJob = require('cron').CronJob;
new CronJob(config.schedule, kick, null, true, config.timezone);
設定ファイル
module.exports = {
timezone : 'Asia/Tokyo',
schedule : 'MM HH * * *',
hosts : [
'xx:xx:xx:xx:xx:xx',
],
wol : {
address : '192.168.xx.255',
num_packets : 10,
interval : 500,
},
};
デーモン化
- 起動
./node_modules/forever/bin/forever start ./wol.js - 終了
./node_modules/forever/bin/forever stop ./wol.js - 確認
./node_modules/forever/bin/forever list
長いパスが嫌な子はパスを通すか wrapper を作るか、global にインストールなぞ。
参照
多少コードは違いますが、ソースはgithubにもあります。
こちらはDockerhubでビルドもしていてコンテナ用になっています。