【Mac】caffeinateが効かない?動画一括処理中にスリープで止まる罠|繰り返し処理の落とし穴

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

夜の間にエンコード完了…のはずが?

「寝ている間に動画のエンコードをさせておこう」

そう思って仕込んだコマンド、朝起きたら気持ちよく全部終わってる・・・はずが

1ファイルしか終わってない!

しかも今まさに2つ目が始まったところ!

なんで?なにしてたの?

今回はそんなやらかし話と備忘録。

前提:ffmpegはcaffeinate付きで実行していた

普段からスリープ対策として、以下のように .zshrc にエイリアス設定していました。

alias ffmpeg="caffeinate -i ffmpeg"

これで「ffmpeg実行中はスリープしないはず」だし、

実際、普段は問題なく動いていました。

寝てる間にフォルダ内の動画を一括エンコード

複数の動画ファイルがあって、ファイルサイズを抑えるためにそれらをエンコードしたかったのです。

でも裏でエンコードさせてると動作が重くなる。
かといってバックグラウンド処理だと遅々として進まない。それもストレス。

で、寝てる間に一括してエンコードさせておこうかと。

対象フォルダで新規にターミナルを開いて、以下を実行。

for f in *.mp4; do ffmpeg -i "$f" -c:v libsvtav1 -preset 6 -crf 26 -pix_fmt yuv420p10le -svtav1-params "tune=0" -c:a copy "${f%-*}.${f:e}"; done

やっていることはシンプルで

  • フォルダ内の .mp4 を順番に処理
  • AV1(libsvtav1)でエンコード
  • 音声はコピー

そして「caffeinateがあるからスリープしないだろう」と、そのまま就寝。

起きて発覚:なぜか1本しか終わっていない

朝チェックすると…

  • 1ファイルだけ完了
  • Macはスリープから復帰した直後
  • ちょうど次のエンコードが始まったところ

つまり、

途中でスリープして処理が止まっていた

なんで!?

原因:caffeinateが“途切れる瞬間”があった

ログなどを確認して分かったことは、

  • 1つ目のエンコード終了後にスリープ条件が成立
  • ffmpegプロセス終了と同時に caffeinate も終了
  • 次のループが始まるまでの“わずかな間”にスリープ突入

つまり、

「連続処理なのに、caffeinateは連続していなかった」

で、スリープから復帰後にジョブを再開、という感じ。

修正:ループ全体にcaffeinateをかける

対策として、コマンドを以下のように変更。

caffeinate -ims zsh -c 'for f in *.mp4; do ffmpeg -i "$f" -c:v libsvtav1 -preset 6 -crf 26 -pix_fmt yuv420p10le -svtav1-params "tune=0" -c:a copy "_${f%.*}.${f##*.}"; done'
  • caffeinate をループ全体に適用
  • -ims でスリープ抑制を強化
  • zsh -c でまとめて実行

これで「処理の隙間」がなくなり、for文全体にcaffeinateがかかっているため、無事に最後まで完走しました。

考えてみれば、まぁそうだよね。という話なのですが。

もう一つの対策法

システム設定 > 省エネルギー > ディスプレイがオフの時に自動でスリープさせない

オン にする。

省エネルギー設定

うん、シンプル(笑

まとめ

今回のポイントを一言でまとめると:

「caffeinateはコマンド単体には効くが、処理の流れ全体は守ってくれない」

“プロセスの切れ目”を意識していなかった、のが結果として盲点になっていました。

「朝起きたら全部終わってるはず」という期待が裏切られると地味にダメージ喰らうというか、脱力感。

特にエンコードみたいな時間かかる処理だと尚更ですね(苦笑

まぁ上にも書きましたが、スリープしないように設定しておけばなんという話でもないのですが、意外とこういう落とし穴あるよ〜という自戒も込めて。

てことで今回は以上!

コメント

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