バッチ製作作業記 その3

動画の変換のバッチファイルの製作記 その3

どうもバッチファイルとしてタスクスケジューラーにアイドル時での実行として登録すると、複数のタスクとして実行されてしまう場合もある。アイドル時でなくなった場合にも自動でバッチが閉じないのというのもある。

この対策として

  • 実行時に特定のプロセスを見つけ出して、そのエンコーダーが実行されている場合は、実行をしないという風にするか
  • 出力先のファイルサイズを取得してから特定の時間SLEEPを実行し、再度同ファイルサイズを取って変化がある場合に既に実行されているとみなし、終了する。

却下された案

  • PHPの関数に特定のファイルリソースにロックをかけるというものがあるので、これが使えるんじゃないかと思っていた。実際はうまくいかない。コマンドラインとして別プロセスとして実行するスクリプトには役に立たないようである。

というわけで案が二つある。

前者は単純にプロセスのイメージ名が見つかった場合に終了させるという処理になり、後者の場合だと、エンコーダーが出力するファイルサイズの推移を n秒の時間の間、監視することになるが、これに変化があると、既に実行済みとみなし、スクリプトを実行せずに停止する。これだと、ファイルの変化を確認する為に nの時間をある程度取らないと重複起動してしまいエラーになり、ファイルが壊れる場合もある。

どちらを選択したかというと、プロセスの監視のほうが有効性がある。見つかったプロセスがある場合、そのプロセスを削除するのではなく、スクリプトのほうを実行するのをキャンセルするだけだからである。この場合、マニュアルで同エンコーダーを使用した際に放っておいていても、実行をキャンセルしてくれる。ただし、アイドル時から復帰してときにバッチはそのままにしていながら同ツールを使うソフトなどを実行した場合での、条件チェックの推移状況を考えると、もう少し仕組みが必要かもしれない。例えば、ファイルの連結よりエンコードする段階でその名前のプロセスがアクティブの操作で実行されているので終了されてしまうというのも少々変だいうことである。

それでもプロセスのチェックのほうが有効性があるかもしれないが、SLEEPしてチェックするほうの仕組みをとりあえず作った。プロセスの取得でチェックする仕組みもそのうち作ろうかと思う。