ストリーム配信を録画する為に定期的にジョブを実行するcrontabを使う

コンピュータ関連
スポンサーリンク

以前カレンダーを使ってネット配信番組の動画を予約録画する記事を書きました。

それにちょっとした問題が発生したので、
今はcrontabを使って起動するようにしています。

要するにカレンダーで起動していた録画実行スクリプトを、
crontabでの起動に切り替えた際のお話です。

カレンダーイベントの情報を読み取ってコマンド実行(第三弾)【Mac|AppleScript】
実現しようとしているのはネット配信番組の動画を予約録画すること。 そのスケジューラにはMac標準アプリのカレンダーを使用。 今回は「あらかじめ登録したイベント情報(URL)をAppleScriptで読み込む」ように改良してみました。

の続き。

スポンサーリンク

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

で抜けます。

つまりまとめると、

  1. 水曜日の19:00から始まる番組(1時間)を1分前から録画し
  2. 終了時の20:00に次の予定(木曜22:30)の4分前にmacを起こすよう設定
  3. 木曜日の22:30から始まる番組(1時間)を1分前から録画し
  4. 終了時の23:30に次の予定(金曜1:00)の4分前にmacを起こすよう設定
  5. 金曜日の01:00から始まる番組(1時間)を1分前から録画し
  6. 終了時の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に関してはこちらに書いてます。

Macでライブ配信を(予約)録画して保存 youtube-dl/ffmpeg【SHOWROOM】
実はちょっと前からShowroomで同時配信しているラジオ番組を視聴するようになりました。 しかしながら、 ふと気がつけば開始時間が過ぎてる! ちょっと席を外したい! 途中で寝落ちした! などなど、 「あぁ録画して保存できれば楽なのになぁ」...

適当なテキストエディタで書いたら実行権限を与えておきます。 

chmod a+x rec_abc.sh

一定時間で終了させたい場合

コンテンツは終了しても配信自体は引き続きされるなどした場合、
その配信が終わるまで延々と録画し続けてしまいます。
そんな配信の場合は例えば1時間経過後に終了させたいなんて時もあるかもしれません。

そんな時は timeout(gtimeout)コマンドを使うと便利

一定時間たったら処理を終了させるコマンドが便利【timeout/gtimeout】
以前ネット配信の番組を自動的に録画する仕組みをつくりました。 基本的にはそれで問題ないのですが、 放送(内容)は終了してもストリーミング(配信自体)はその後もしばらく続くような場合、 当然ながら配信が完全に終了するまで録画し続けてしまいます...

まとめ

とまぁこんな感じで運用しています。

以前は問題なくカレンダーから実行できていたのですが、
しばらく経ってからうまく動作していないことに気がつきました。

起動はするのですがスクリプトが実行されないまま終了してしまっているようです。
ログを見ても原因ははっきりせず。

ただどうやらループ処理の扱いで問題が発生している模様。
ただでさえ繰り返される処理を毎週のように実行するため、
大量にループするような処理の実行が制限されているのでしょうか。

※ただ単に秒数を”00″にセットする部分で記述ミスしてただけみたい(汗

crontabでは問題なく実行してくれているので、
毎週決まった時間の配信は crontab で、
個別の番組などは以前のようにカレンダーにイベントとして書き込み、実行しています。

ということで今回は以上。

コメント

タイトルとURLをコピーしました