以前カレンダーを使ってネット配信番組の動画を予約録画する記事を書きました。
それにちょっとした問題が発生したので、
今はcrontabを使って起動するようにしています。
要するにカレンダーで起動していた録画実行スクリプトを、
crontabでの起動に切り替えた際のお話です。
の続き。
crontabの使い方
crontabの使い方については他のサイトでも数多解説されているので
ここでは簡単な説明にとどめます。
ちなみにターミナルを開いて
man crontab
と入力すればマニアルを見ることができます。
あるいは単に
crontab(5)
などとだけ入力し、
右クリックから「manページを開く」で表示できます。
具体的な内容は後ほど順を追って説明します。
今回やりたいこと
- 定期的なスクリプトの実行
- 実行時間に合わせてmacのスリープ解除または起動
この2つ。
これらをcrontabを使って実行していきます。
ただし1つ目はユーザー権限で実行しますが、
2つ目はRoot権限で実行する必要があります。
今回は以下のようなスケジュールを設定したいものとします。
水曜日の19:00から始まる番組(1時間)を録画し
木曜日の22:30から始まる番組(1時間)を録画し
金曜日の1:00から始まる番組(1時間)を録画する。
そしてそれぞれの開始4分前にmacの起動またはスリープ解除を行う。
スケジュールのテキストファイルを用意する
いきなり入力するのは不安なので、あらかじめテキストファイルとして用意したものを読み込ませることにします。
#「cronsche.txt」 59 18 * * 3 /Users/aaa/mytools/rec_abc.sh 29 22 * * 4 /Users/aaa/mytools/rec_def.sh 59 00 * * 5 /Users/aaa/mytools/rec_ghi.sh
書式フォーマットは
分 時 日 月 曜日 コマンド
つまり上から順番に
水曜日 18:59 rec_abc.sh を実行
木曜日 22:29 rec_def.sh を実行
金曜日 00:59 rec_ghi.sh を実行
という意味になります。
番組開始予定の1分前に起動するようにしています。
月と曜日に関しては jan feb marや、sun mon tue などの省略系が使えます。
大文字小文字の別は問われません。
曜日を数字で表す時は月曜日が「1」となり、「0」か「7」が日曜日を表します。
後に続く「rec_abc.sh」などが録画を実行するスクリプトです。
それについては後述。
crontabにスケジュールを読み込ませる
記述に間違いがないか確認したらcrontabに予定を読み込ませます。
#デスクトップにtxtファイルがある場合 crontab ~/Desktop/cronsche.txt
ちゃんと設定できたか -l(小文字エル)オプションで確認。
crontab -l
pmsetで電源管理
定期的にスクリプトを実行する設定はできましたが、
macがスリーブや電源オフであった場合には実行してくれません。
録画を開始する数分前に起こしておく必要があります。
そのために pmset というコマンドを使うのですが、
こちらはルート権限で実行する必要があります。
基本的には同じ作業です。
あらかじめテキストファイルにスケジュールを書いておきます。
#「cr_pmset.txt」 00 20 * * 3 pmset repeat wakeorpoweron R 22:26:00 30 23 * * 4 pmset repeat wakeorpoweron F 00:56:00 00 02 * * 5 pmset repeat wakeorpoweron W 18:56:00
水曜日 20:00 に R(木曜日の) 22:26 に起動またはスリープ解除 を設定
木曜日 23:30 に F(金曜日の) 00:56 に起動またはスリープ解除 を設定
金曜日 02:00 に W(水曜日の) 18:56 に起動またはスリープ解除 を設定します
ターミナルから
sudo su
パスワードを入力してrootとして実行します。
やることは同じ、
#デスクトップにtxtファイルがある場合 crontab ~/Desktop/cr_pmset.txt
設定を確認したら
exit
で抜けます。
つまりまとめると、
- 水曜日の19:00から始まる番組(1時間)を1分前から録画し
- 終了時の20:00に次の予定(木曜22:30)の4分前にmacを起こすよう設定
- 木曜日の22:30から始まる番組(1時間)を1分前から録画し
- 終了時の23:30に次の予定(金曜1:00)の4分前にmacを起こすよう設定
- 金曜日の01:00から始まる番組(1時間)を1分前から録画し
- 終了時の02:00に次の予定(水曜19:00)の4分前にmacを起こす
これを繰り返すことになります。
配信動画を録画するスクリプト
単に youtube-dl を起動しているだけです。
(rec_abc.sh)
#!/bin/bash export PATH=$PATH:/usr/local/bin youtube-dl https://www.showroom-live.com/abc
youtube-dlに関してはこちらに書いてます。
適当なテキストエディタで書いたら実行権限を与えておきます。
chmod a+x rec_abc.sh
一定時間で終了させたい場合
コンテンツは終了しても配信自体は引き続きされるなどした場合、
その配信が終わるまで延々と録画し続けてしまいます。
そんな配信の場合は例えば1時間経過後に終了させたいなんて時もあるかもしれません。
そんな時は timeout(gtimeout)コマンドを使うと便利
まとめ
とまぁこんな感じで運用しています。
以前は問題なくカレンダーから実行できていたのですが、
しばらく経ってからうまく動作していないことに気がつきました。
起動はするのですがスクリプトが実行されないまま終了してしまっているようです。
ログを見ても原因ははっきりせず。
ただどうやらループ処理の扱いで問題が発生している模様。
ただでさえ繰り返される処理を毎週のように実行するため、
大量にループするような処理の実行が制限されているのでしょうか。
※ただ単に秒数を”00″にセットする部分で記述ミスしてただけみたい(汗
crontabでは問題なく実行してくれているので、
毎週決まった時間の配信は crontab で、
個別の番組などは以前のようにカレンダーにイベントとして書き込み、実行しています。
ということで今回は以上。
コメント