eXcale開発チームの平井です。
eXcale では、その裏側の仕組みで、サーバのセットアップやアプリケーションのデプロイ処理にCapistranoを使っています。今回の記事は、そのCapistranoに関するTIPSのご紹介です。
Capistranoでコマンドを実行する際に、その実行ログを特定ファイルに保存しつつ、コマンドの実行結果でその後の処理を振り分けたいといったことは無いでしょうか。今回は、Capistranoで実行したコマンドの結果を標準出力とファイルに出力しつつ、対象コマンドが成功/失敗したかの終了ステータスを扱う方法をご紹介します。
>>eXcaleは期間限定でサインアップキャンペーン実施中!気になる内容はこちら<<
どうすればいいの?(実現方法)
次のようにteeコマンドとPIPESTATUSを用いることで、コマンドの実行結果を標準出力とファイルに出力しつつ、対象コマンドの終了ステータスを扱う事ができます。
(標準エラー出力も同じファイルに書くように、2>&1としています。)
以下のサンプルコードはCapistrano v3.1.0で実行を確認しています。
コードの内容は、ローカルにあるファイルをlsするだけの簡単なコードです。事前にファイル( /tmp/foo/bar )を作成しておく必要がります。
|
1 2 3 4 5 6 7 8 |
require 'capistrano/setup' set :stage, :production task :exec_ls do run_locally do execute "ls /tmp/foo/bar 2>&1 | tee -a /tmp/exec_ls.log;(exit ${PIPESTATUS[0]})" end end |
2系の場合は以下のサンプルになります。Capistrano v2.15.5で実行を確認しています。
また、以下を実行する場合は、username、passwordは環境に併せて変更してください。
|
1 2 3 4 5 6 7 8 |
set :user, 'username' set :password, 'password' role :local, 'localhost' task :exec_ls, :roles => :local do run "ls /tmp/foo/bar 2>&1 | tee -a /tmp/exec_ls.log;(exit ${PIPESTATUS[0]})" end |
ポイントは2点です。
- teeコマンドで標準出力とファイルに出力していること
- 終了ステータスをPIPESTATUSを使って返していること
teeコマンドを使用することで、パイプからの入力を標準出力と指定ファイルに出力することができます。
ただし、コマンドをパイプでつなげた場合、その終了ステータスは、最後のコマンドの終了ステータスになってしまうため、teeコマンドを使っただけでは、対象のコマンドのステータスを適切に扱う事ができません。そのため、PIPESTATUSを使用し、対象コマンドの終了ステータスを明示的に返すことで、終了ステータスを取得できるようになります。
以上のようにteeコマンドとPIPESTATUSを用いることで、コマンドの実行結果を標準出力とファイルに出力しつつ、対象コマンドの終了ステータスを扱えるようになります。