テレビ録画メディアサーバー構築入門(第19回)
トラブルシューティング
サーバークラッシュ
サーバーとしてlinuxを使用していて、こんなことが起きるのは珍しいため驚いたのだが、カーネルパニックによる機能停止を経験した。
サーバー側で録画中のときに、スマホやFire TV(アンドロイド端末)にてJellyfinクライエント(専用、またはweb)を利用中に生じる。
原因をさぐると、BCASカードリーダーとIntel内蔵Wifiドライバ (iwlmvm)の干渉らしく、OSレベルのバグらしい。
対策として、サーバーのネット接続方法をWi-Fiから有線イーサネット接続に変更したら問題は解消した。
error: TSDecoder#数字 unexpected dead
Mirakurunのlogにみられる深刻なエラーで、BCASカードが正常に刺さっていない場合にみられる。が、チューナー側の不具合によって生じる場合もある。(カードリーダーへの電力供給不足による。ソフトウェア的に対処可能だが法的問題あり。第3回参照。)
この記事で非推奨としたPX-Q1UDを使っていると、内蔵4チューナーのうちのどれかの不具合により録画が失敗することがある。失敗率の高いチューナーは番号(/dev/dvb/adapter数字)を特定してmirakurunの設定から外す。いつも失敗するわけではなく、しばらく使っていると不安定になりだす「心配な」チューナーについては、優先度を下げて、複数番組同時録画の際の予備役助っ人として運用するのだが、よくわからない理由により、このエラーTSDecoder#. unexpected dead が出て使用不能になる。そのまま放置すると、すべてのチューナーが使用不能に陥ることがある。こうなるともうどうしようもないので、cronで 以下のchkerr.shを走らせることにした。
crontab -l* * * * * $HOME/chkerr.sh >> /dev/null 2>&1cat chkerr.sh#!/bin/bash
# 変数設定
LOG_PATTERN="error"
NTFY_URL="https://fearow22.taile153a7.ts.net/PX-S1UD"
LOGURL="http://100.x.y.z:40772/api/log"
# ログ出力を取得
OUTPUT=$(curl $LOGURL 2>/dev/null | grep -i "$LOG_PATTERN")
echo $OUTPUT
# エラーが見つかった場合のみ curl を実行
if [ -n "$OUTPUT" ]; then
curl -H "X-Priority: 4" -d "ERROR: $OUTPUT" $NTFY_URL
fi
通知用NTFY_URL:
ドロップエラー
(PX-Q1UDの場合)経験的に、使用不能になる前に、予兆として、録画結果にドロップ(データ欠損)が確認できるようになる。これを検知して、通知することで、ドロップしはじめたらすぐ手動でUSBを抜き差しをすれば、とりあえず問題は解決する。
現行版Mirakurun 4.0.0-betaではドロップ数を表示してくれるが、apiとして取得する方法は提供されていないようです。EPGStationにも、過去にはドロップ情報をしめす機能があったような気もするが現行版v2.10.0には実装されていないようです。
なので、録画動画を処理する前のタイミングで ffmpeg でエラーチェックしてntfyで通知するスクリプトを使うことにした。
takya@fearow22:~/work$ cat chkdrp.sh
#!/bin/bash
LOGFILE="/tmp/chkdrp.log"
LOG_PATTERN="error"
NTFY_URL="https://fearow22.taile153a7.ts.net/PX-S1UD"
#LOCKFILE="/tmp/encode.lock"
## ロックファイルが既存の場合は終了
#if [ -f "$LOCKFILE" ]; then
# echo "encode.sh is already running. Exiting."
# exit 1
#fi
#touch $LOCKFILE
ffmpeg -v error -i "$1" -f null - 2> $LOGFILE
OUTPUT=$( grep "$LOG_PATTERN" $LOGFILE|tail)
#OUTPUT=$( grep -i "$LOG_PATTERN" $LOGFILE|tail)
if [ -n "$OUTPUT" ]; then
echo "ERROR: DROP $1 $OUTPUT"
curl -H "X-Priority: 4" -d "ERROR: DROP $1 $OUTPUT" $NTFY_URL
fi
ffmpeg -v warning -i "$1" -f null - 2> $LOGFILE
OUTPUT=$( grep -Eq "non[- ]monotone|Invalid DTS|invalid PTS|corrupt|Packet corrupt|timestamp" $LOGFILE|tail)
if [ -n "$OUTPUT" ]; then
echo "ERROR: CORRUPT $1 $OUTPUT"
curl -H "X-Priority: 4" -d "ERROR: CORRUPT $1 $OUTPUT" $NTFY_URL
exit 1
fi
## lockfile を削除
#rm -f $LOCKFILE
enc01.shのtsreadex行の直前に、以下1行を追記する:
$WORKDIR/chkdrp.sh "$FILE" #エラーチェック (追記:2連PX-S1UDで同症状確認。ハードウェア的な理由によるもので、mirakurunでは検知できず、rebootで解決しないケースあり。いったん電源を落とすと解決する。遠隔地に置き去りのサーバーの場合どうする!?→重要課題)
熱暴走
ハードウェアエンコード(第16回)を試す前に、熱暴走らしきクラッシュを経験した。対策として、enc0.sh, enc1.shの ffmpegのOPTION に -threads (数字)を追加して使用スレッド数を制限した。処理速度が落ちるので、encode.shの変数speedを小さくする。
どう変更すべきかは、PCの性能によります。
スレッド数(論理コア)は コマンド nproc で確認できます。
使うスレッドを半分にして、エンコード速度がどのくらい遅くなるかを確認する、など。
夏場はUSBファンを使うことにした。
PCのCPUのみならず、チューナーも熱を帯びます。休みなく録画し続けると不安定化要因となる(ライトな使用法では問題ない)。
索引
自分でも何をどこに書いたかわからなくなってきたので、今後の作業用に各回の概要をまとめておくことにした。
第1回:はじめに。準備が必要なもの
第2回:Ubuntu OS インストール。はじめてのlinux。
新PCが使えるようになる
第3回:デバイス認識。EPGStation, Mirakurunインストール
テレビ録画できるようになる
第4回:AviSynth, chapter_exe, logoframe, join_logo_scp, ffmpeg
第5回:CMカット。ロゴファイル作成
第6回:作業フォルダ、メディアフォルダ。Jellyfin インストール
とりあえず視聴環境が整う



コメント