少し思うところがあったのでメモ。
ほぼ自己流なので、もっと良いのがあれば教えて欲しいところ。
そもそもマニュアルオペレーション(手作業)するな
ごもっとも。でもやらないといけない深淵な事情があるんです。
事前条件と事後条件を明確にしておく
どういう状態からどういう状態に変わるべきか事前に明確にしておくべきです。
それなしに普通は作業しません。
切り戻し手順を考えておく
途中でミスる可能性があるポイントを明確にしておくこと。
それぞれのタイミングでの切り戻し手順をしっかり考えておくこと
作業手順を事前に書く
オペレーション中にアドホックに手順考えないですよね?
複数手順あるならスクリプト化する
できる限りステップを減らします。可能ならスクリプトを一発叩くだけにします。
set -eu は付けた方がいい
eオプションはコマンドのステータスコードが0以外(異常終了)したときに、その時点で終了してくれます。
uオプションは未定義変数を参照したときに終了してくれます。
#!/bin/bash -eu
もしくは
#!/bin/bash set -eu
なかんじでオプション設定できます。
bash -ue script.sh
bashの引数でもOK
追記 2014/08/19 20:18
はてブでも指摘をいただきました、ちょっと書き忘れたんですが、正常終了しているのに0が帰ってこなかったり、異常終了していても問題ない場合があったりします。
確かにそういう場合にひっかかると標準エラー出力になにも吐かずに終了してしまうので、異常終了しているのに気がつかないという罠にはまる可能性があります。
なので、スクリプトの最後に終了の旨をechoしてあげるといいかもです。
ちなみに、スクリプト実行後に$?の値を見てあげると、ちゃんとスクリプト自体が終わったかどうか確認できます。
echo $?
事前に検証環境で実行しているから普通は問題ないとはおもいますが、0を返してくれない場合には、こんなワークアラウンドを使うと良いです。
not_zero_return_comand || true
なにがなんでもtrueを返させるか
set +e not_zero_return_comand set -e
コマンド実行前にeオプションを無効にして、実行した後にeオプションを再度有効にするという手です。
set -x はお好みで
デバッグ時はxオプション付けておくと便利ですが、本番作業時はお好みで。
コマンド/スクリプト実行するときはfcを使った方が良い
コマンドラインでfcと叩くと$EDITORで定義されているエディタが立ち上がります。
実行するコマンドを記述して保存終了すると、その内容が実行されます。
コレにより、手順書からコマンドをコピペしたのはいいけど、コピペミスで酷いことになるという状況は避けられます。
コピペミスでの障碍起こすのって意外にやりがちなのです。。。
余談: mysqlクライアントにもeditというので似たことが出来ます。
ロギング大事
コマンド実行したときのログがどこに吐かれるのかをあらかじめ確認しておくこと。
異常終了した際、何が原因かすぐに分からないと大きな障碍につながります。
もしロギングの仕組みが無いのであれば、teeしてあげるかscriptコマンドを使うと良いです。
bash script.sh 2>&1 | tee --append /tmp/$(date +%Y%m%d).log
コツとしては、標準エラー出力を標準出力にリダイレクトしてあげるとエラーもログに残るので良いです。
確実にログファイルは新規作成されると保証できるなら、appendオプションはいらないかもです。
実行したコマンドを含めて記録したいならscriptコマンドを使うと良いです。
scriptコマンドに関してはこっちで昔書きました。
できればペア作業が良い
ダブルチェックしたからってミスが無くなるわけではないですが、
作業者と別の観点で見る人がいると多少ましではあります。
テディベア効果に多少は期待できます。
ざっくりこんな感じですかしら。
何かあったら追記します。