シェル」カテゴリーアーカイブ

PHPでバッチを書いてシェルで制御する

投稿日:

このバッチがきちんと終わったら、あのバッチを動かしたい。なんて事はよくあると思います。今までそのへんの事はcronで制御していたのですが、バッチがクソ増えてきてスケジューリングがつらたん。。という状態になり、こうなったら一連の処理を行うバッチはシェルで制御した方が楽だよね、そうだよね、じゃあ調べてね、ってなった時のことを書きます。
※ ジョブ管理ツールとかは無しで
※ 制御するとかありますが、そんな難しいことではないです
※ ちょっと回りくどい感じで書いていますので出来れば最後まで読んでみてください

やりたいこと

バッチA (hoge.php) 実行

エラー無し → (No) → バッチ終了
↓ (Yes)
バッチB (piyo.php) 実行

やりたいことはこんな感じです。

最初に書いたシェル

#!/bin/bash

PHP_PATH=`which php`
BATCH_DIR="/your/batch/dir"

${PHP_PATH} ${BATCH_DIR}/hoge.php \
&& ${PHP_PATH} ${BATCH_DIR}/piyo.php

>/dev/null 2>&1 これ書く書かない問題は別とします

普通にシェルで制御するって言われるとこんな感じで、&&でつなげて実行する方法を思いつくのではないでしょうか。
でもね、これですんなりいけるバッチは、エラーがあった場合にきちんと異常終了(終了コード 0 以外を返却)するように作られているバッチだけなんですよね。
続きを読んでみようかな…

バッチスクリプトを書いてハマったところ

投稿日:

wkhtmltopdf / wkhtmltoimageを使って画面キャプチャするバッチスクリプト
を先日書きましたが、こういった類のバッチを書いたのは初めて?だったので色々ハマりました。

今後同じ過ちを繰り返さぬように、ここに記したいと思います。

変数の即時展開, 遅延環境変数 にハマった(バッチスクリプト)

ハマりポイント

for /f "skip=1 tokens=1,2,3* delims=," %%i in (%TARGET%url.csv) do (

  set valid=false
  if %%k == pdf set valid=true
  if %%k == img set valid=true
  if %valid% == true ( # ここにこない!!
    call :OUTPUT_FILE %%i %%j %%k
  ) else (
    echo ----- [error] Output type Please specify the pdf or img -----
  )

)

最初こう書いていたんですが、validがtrueにならずにかなり悩みました。
でもこの辺インターネッツはやっぱり凄くて調べてみると以下の記事が見つかり解決できました。

変数の中身は、その行を読み込んだときに値に置き換わる

もひとつ重要なことに、上記の変数はfor文の中などでは定数のように振る舞います。つまり、for文の実行前に%変数%が静的に展開されます。実行中に値を変化させたい場合は、setlocal enabledelayedexpansion を宣言します。遅延環境変数と呼ばれてるようです。そして、変数を参照する時には!変数!のように、感嘆符で囲みます。

バッチファイルは1行(1文)が読み取られたときに変数の展開が終わる(即時展開)から、最初のset valid=falseでsetされたvalidは、if文の評価時で既にfalseになっているというわけです。
と、ざっくり自分なりに噛み砕いてみましたけど、意味不明なのでとりあえずコードで。
続きを読んでみようかな…

wkhtmltopdf / wkhtmltoimageを使って画面キャプチャするバッチスクリプトを書いた

投稿日:

にあるとおり、画面キャプチャツールを作るにあたって wkhtmltopdf が(自分の中で)最高だった話を書きます。

何が最高だったのか

こんな要望

  • 画面をキャプチャしたい
    • 記事とかの再校に使いたい
  • できればPDFにしたい
  • ローカルで完結させたい
    • サーバサイドでやってもいいけど、余計なものをいれたくない
  • プログラマー以外の人が使う
    • そのため、なるべく負荷が無い様に
  • そんなに工数をかけない
  • Windowsだ

に対して以下を調べてみた。

どれもこれも、あともう一歩。
そんな時、僕を救ってくれたのが wkhtmltopdf なのであります。
wkhtmltopdf
これの何がいいってプラットフォームごとにバイナリが配られていて、インストールしたら以下でポンっと出来るところ。

wkhtmltopdf http://google.com google.pdf

まじやばい。感動した。
そして、これを利用するバッチスクリプトを書いたので公開します。

shimabox/ecap: Easy Capture (簡単キャプチャツール)

Easy Capture – 簡単キャプチャツール -  
略してecap (イーキャプ) です。
※ イーカップではありません

  • CSVファイルに書かれている値 (URL,ファイル名(拡張子無し),出力タイプ(pdf or img)) を見て、画面キャプチャします
  • 画面キャプチャは pdf or jpg で出力します
  • wkhtmltopdf に依存します

続きを読んでみようかな…