人生100年!生涯エンジニア人生!

楽しいエンジニア人生!

tailコマンドで、昨日(2020年6月24日)のスクリプトが止まったのでリカバリーする

止まるときもある

2020年6月24日の記事で10万行のURLリストと格闘しました。
kawahara-ci.hatenablog.com
ただ、インターネットは生もので運良く全て上手く行くわけはなく運が悪ければ通り止まります。
実際に止まりましてtail -f 出力ファイル でも更新されなくなりました。

どうすれば良い?

  1. 止まっている行を探す。
  2. スクリプトを止める。
  3. 元のスクリプトを暫定的に変更する。
  4. 実行し直す。

止まっている行はpsで簡単にわかります。

12605 ttys001    0:00.75 curl -A "{$USER_AGENT}" --head http://にゃ~ん

この該当のURLを読み込みファイルでgrepします。
grep -n 'http://にゃ~ん' ./url.txt

43152:http://にゃ~ん

43152行目だとわかります。

次にCtrl-Cでスクリプトを止めます。

それから元のスクリプトを少々手直します。
ここで活躍するのがtailコマンドです!
tailコマンドはファイルの後ろから表示するコマンドで、デフォルトは最後の10行を表示します。
行数の指定も可能でtail -n 20 ファイル名とすると最後の20行を表示します。(-20 と指定も可能)

今回の件はファイル全体の行数から止まった行数を引いた数だから100000 - 43152 = 56848で、止まった行数も含みたいので、tail -n 56849 ファイル名(確認のためにはtail -n 56849 ファイル名 |headとするのが良い)と思うかもしれませんが、実はtailコマンドには便利な技があります。

tail -n +43152 ファイル名 |headとしてみましょう、先程の計算結果での出力と同じ結果になりましたよね?
tailコマンドでは+数値でその行以降というやり方あります。

これでスクリプトを変更します。

#cat ./url.txt | while read line
tail -n +43152 ./url.txt | while read line

変更したら、最後実行しましょう。 実行したけど実行が進まない場合は、43152行が無反応ってことなので、一行進めて43153行に変更しましょう。
これで再開できました、あとは放置するだけです。
余談ですが、止まったのは寝ているときだったので、5時間ぐらい無駄に過ぎました・・・。
止まったらAlertを投げる手もありますが、今回はリカバリー出来るだけでヨシ!とします。