俺の愛用ワンライナー、Web企業のエンジニア16人に聞きました

エンジニアの皆さんが愛用する自作のワンライナーってどんなもの?Web企業で働くエンジニアの方々に、秘蔵のワンライナーを聞きました。

俺の愛用ワンライナー、Web企業のエンジニア16人に聞きました

ワンライナーとは、何か特定の処理を「たった1行のプログラム」だけで実現するものです。サービス運用に携わるエンジニアの皆さんも、愛用している独自のワンライナーを持っているのではないでしょうか。「独自のワンライナー」とは、エンジニア各人のナレッジやノウハウが詰まっているとも考えられます。

本企画ではさまざまジャンルで活躍するエンジニア16人に、業務を支えてくれるワンライナーを紹介してもらいました。参考に使ってみるも良し。眺めて楽しむも良し。個性あふれる貴重な「オレオレ・ワンライナー」の数々をご覧ください!

※各カテゴリー内では所属企業名の50音順に掲載。回答者は敬称略とする。

リソース管理

プロセスを停止する

pgrep -f [h]ogehoge | sudo xargs kill -9
  • 使用言語:bash

サーバ内で実行されているhogehogeという名前のプロセスを、ゴースト化・サスペンド化にかかわらず絶対にkillします。プロセス名の1文字目を[]で囲むことにより、pgrepで探しているプロセス自体が除外されます。

運用中のサービスのなかで、特定のプロセスが意図しない形で複数立ち上がってしまっていたものを、正常・非正常実行にかかわらず、全て停止しなければならない、という残念な状況で使う処理です。気持ちも残念になります。

比較的、汎用性のあるワンライナーですが、いろいろなプロセスで多用する状況になると悲しい気持ちになります……。

Google Kubernetes Engine全体のノードのリソース状況を確認する

kubectl get nodes | grep gke | cut -f1 -d' ' | xargs -I{} sh -c 'kubectl describe node {} | grep -A 2 "CPU Requests" | tail -n 1; sleep 1'
  • 使用言語:bash

Google Kubernetes Engine全体のノードのリソース状況を確認するワンライナーです。GKEノード数が多くなり、どれくらいリソースを利用しているのか把握しにくくなったため、一括で確認する方法が必要になり作成しました。なお、xargsを使わずに他の方式で書いたら速くなりました。修正後ワンライナーは以下の通り

kubectl describe node | egrep -A 2 "^ +CPU Requests"|egrep '[0-9]+'

物理メモリを多く使用しているプロセスを抽出する

ps aux | sort -n -k 6 | tail -n 10
  • 使用言語:bash

物理メモリを多く使用しているプロセスの上位10件を抽出します。引数の数字を変えるだけでCPUとメモリについて調べることができて便利です。複雑なコマンドではないため忘れにくいのも良い点です。サーバーのリプレイスでリソースの消費に差が出たとき、このワンライナーで比較できたため、大活躍しました!

CPU使用率が高いプロセスを見つける

watch -n 2 "ps aux| sort -nk +3 | tail" or watch -n 2 "ps aux| sort -nk +4 | tail"
  • 使用言語:bash

CPU使用率が高いプロセスを見つけるときに使用します。なお、+4はメモリの使用率が高いプロセスを見つけるときのオプションです。Dockerになっていないサーバーでなぜか負荷が高くなるときがありますが、このワンライナーを使えば、原因となっているプロセスを効率よく特定できます。

データ集計

maillogから、メールの送信者情報を取得する

(for queue in `grep 'status=sent' /var/log/maillog | awk '{print $6}' | tr -d ':'`; do grep $queue /var/log/maillog | grep sasl_username | awk '{print $7}' | cut -d '=' -f2 | tr -d ','; done;) | sort | uniq -c | sort -n
  • 使用言語:bash

maillogからqueue IDを抽出し、各queue IDごとのユーザ認証者のリモートホストとリモートIPを拾い、出現回数とともに出力します。

以前、大規模メールシステムを扱っていた際に大量送信するユーザがいたためサーバが高負荷になることがあったのですが、その原因特定のために使用していました。postfix + procmail + formail を使っていてqueue IDが変化して送信されることが多かったのと、出力結果をそのまま報告書にコピペしたいので、こんな回りくどいことをしていました。

Apacheのアクセスログから、ページごとのアクセスランキングを集計

zgrep -hE "\"GET /.+ HTTP.+\" 200 " `find /var/log/httpd -name 'access_log.*'` | awk '{print $1$8}' | sort | uniq -c | sort -nr
  • 使用言語:bash

Apacheのアクセスログから、アクセスランキングを算出。アクセス数の多い順にそのURLとアクセス数を表示します(Common Log Format with Virtual Hostで動作します)。

実行例:
1263 www.example.com/
1352 www.example.com/about/
 456 www2.example.com/

私自身はワンライナー初心者ですが、この記事企画を機に、複数のWebサイトを運用しているWebサーバで、アクセスログからアクセスランキングを算出したいと思い書いてみました。awkコマンドの利便性に感動しました。

時間帯ごとのおおまかなエラーレートを集計する

awk '{$2=substr($2,1,13);print $2,$3,$4,$6;}' access.log | sort | uniq -c

access.log は以下のようなWebサーバ(nginxなど)のログファイルを想定します。

10.229.60.225 2018-02-27T08:40:14+09:00 "GET /path/to/app HTTP/1.1" 200
10.93.104.150 2018-02-27T11:06:47+09:00 "DELETE /path/to/app HTTP/1.1" 200
10.255.181.79 2018-02-27T11:07:47+09:00 "GET /path/to/app HTTP/1.1" 200
10.108.135.104 2018-02-27T14:43:21+09:00 "POST /path/to/app HTTP/1.1" 200
10.209.240.194 2018-02-27T18:39:07+09:00 "POST /path/to/app HTTP/1.1" 502
  • 使用言語:bash、awk

時間帯ごとの大まかなエラーレートを集計できます。もちろん少し変更すれば別の指標での集計も容易です。わざわざDBやSQLiteに入れるまでもないレベルの集計なら、このワンライナーの応用範囲はかなりあります。

環境が整ってきたため、現在では本番サーバ上のログを直接集計することはありません。そういった環境が整備されていない頃、リリース後の監視の際にこのようなワンライナーを重宝していました。

データベースからダンプファイルを取得する

pg_dump -h hostname -U username -f #{Rails.root}/tmp/app_name.dump database_name
  • 使用言語:SQL(PostgreSQL)
エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く