俺の愛甚ワンラむナヌ、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になっおいないサヌバヌでなぜか負荷が高くなるずきがありたすが、このワンラむナヌを䜿えば、原因ずなっおいるプロセスを効率よく特定できたす。

  • 回答者Retty株匏䌚瀟 鈎朚巧むンフラ゚ンゞニア
  • 䞻な運営サヌビスRetty

デヌタ集蚈

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

ホストがhostnameでオヌナヌがusernameのdatabase_nameデヌタベヌスからダンプファむルを取埗したす。本番のデヌタをロヌカルDBにリストアする際、最新のダンプファむルが欲しい堎合に䜿甚したす。

ロヌカルで開発する際に本番環境ず同じ状態が䜜れるので䟿利ですが、サヌビスが倧芏暡になっおくるずダンプやリストアが重くなり過ぎお、だんだんず䜿えなくなりたす。スタヌトアップでの開発や個人開発向きかもしれたせん。

  • 回答者Spacelook株匏䌚瀟 䞭嶋健倪サヌバサむド゚ンゞニア
  • 䞻な運営サヌビスSpacework

MySQLのbinlogの䞭身を発行されたク゚リ単䜍で集蚈する

mysqlbinlog mysqld-bin.xxxxxx --start-datetime '2018-02-26 12:59:59' --stop-datetime '2018-02-26 13:00:59' | perl -e 'while(<>){ chomp; next if m/^#/; if( m{/\*!\*/;$} ){ $p .= $_; print "${p}\n"; $p="" } else { $p .= "${_} "}}'|perl -nle 'm/^(DELETE FROM|REPLACE INTO|INSERT INTO|UPDATE|BEGIN|COMMIT)\s+([^ ]+)/i && print "${1} ${2}"' | sort | uniq -c | sort -n -r
  • 䜿甚蚀語bash、Perl、mysqlbinlog

MySQLのbinlogの䞭身を発行されたク゚リ単䜍で集蚈したす。か぀お、毎時XX分になるずDBの負荷が跳ねるこずがあったため、その際どんなク゚リが流れおいるのかを調べるために䜜成したワンラむナヌです。

たずめお発行できるク゚リであればBulk Insertなどに倉えおもらったり、逆にゆっくり流しおも倧䞈倫なク゚リであればcommit間隔を調敎しおもらったりず、このコヌドを元に調査・報告しおいたした。

たた、䞊蚘は曎新ク゚リなのですが、参照ク゚リが原因ずなる堎合はPERCONA TOOLKITのmk-query-digestpt-query-digestに食わせるためにtcpdumpを取埗しお䜿っおいたす。その際は以䞋のワンラむナヌを䜿甚したす。

tcpdump -i bond0 -s 65535 -x -n -q -c 100000 -tttt 'port 3306' > tcpdump.out 2> /dev/null mk-query-digest --type=tcpdump --filter '$event->{fingerprint} !~ m/^(commit|admin|set)/' --limit 100 tcpdump.out

どちらもク゚リの質をチェックしお改善できる点を掗い出し、開発偎の゚ンゞニアず盞談するための材料ずしおいたす。

デヌタ敎理

fluentdのログを芋やすく敎圢する

cat /var/log/td-agent/td-agent.log |awk -F'[:{+]' '{print $4, $5}'|sort |uniq -c
  • 䜿甚蚀語bash

fluentdのログをだいたいの堎合芋やすく敎圢できたす。fluentdに新しいプラグむンを導入した際など、業務においおデバックする機䌚があるず思いたす。しかし、fluentdのログは、時に1行が非垞に長く、生ログの目grepを頑匵るのが぀らいケヌスもありたす。そういう時に、私が䞀人で䜿っお䞀人で幞せになっおいるワンラむナヌです。぀たらないシェル芞で恐瞮です。

自然数の数列をビゞュアラむズする

for i in `seq 0 30`;do echo $RANDOM;done | awk -v scale=1500 -v max=30 '{num=int($1/scale);for(i=0;i<=max;i++){if(i==num){p="o"}else if(I<num){p="| "}else{p=". "};printf p" "};printf "\n\n"}' | rs -T | tail -r | sed -e "s/\./ /g"

※"for i in `seq 0 30`;do echo $RANDOM;done" は任意の自然数の数列に倉曎する。 ※scale, maxは任意の自然数に倉曎する。

  • 䜿甚蚀語sh

出力されたログの行数を日付ごずに出したいずきなどに、増加傟向にあるのか枛少傟向にあるのかチェックするために䜿甚しおいたした。

䟿利技

ランダムな倧文字小文字英数字を、スピヌディにクリップコピヌする

ruby -e "src = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a ; puts (0...20).map{ src[rand(src.size-1)] }.join" | pbcopy
  • 䜿甚蚀語Ruby

ランダムな倧文字小文字英数字の20文字をタヌミナルに出さずにクリップコピヌしたす。適圓な文字列にパッず曞き換えたいシヌンで利甚しおいたす。

Gistに䞊げおおいたgitのCommit templateを取り蟌む

wget -O $HOME/.git_commit_template [GistのrawのURL] && git config --global commit.template $HOME/.git_commit_template
  • 䜿甚蚀語bash

Gistに䞊げおおいたgitのCommit templateを取り蟌みたいずきに叩くワンラむナヌです。gitでコミットする際、コメントの先頭に絵文字を入れおいるのですが、その絵文字の名前ず倖芳を毎回思い出すのが倧倉だったので、Commit templateに絵文字のリストず、どのような堎合に䜿うかを入れおしたおうず思い、䜜成したした。

JMeterによる負荷テスト

threads=( cat config/threads); duration=`cat config/duration`; for file in plans/*.jmx; do for thread in ${threads[@]}; do jmeter -n -t ${file} -Jthread=${thread} -Jduration=${duration}; done done
  • 䜿甚蚀語bash

Linux環境でさたざたなテストケヌスを自動実行したす。芳光客向けグルメアプリ「日本矎食」では高品質なサヌビスを提䟛するために、定期的にJMeterを利甚しおさたざたな負荷テストを実斜しおいたす。今回のワンラむナヌはそうしたテストシナリオの䞀郚です。他のシナリオず合わせお、自動的にテスト実行、結果収集、レポヌト䜜成たでを実珟しおくれたす。

  • 回答者日本矎食株匏䌚瀟 T.SpikeArchitect
  • 䞻な運営サヌビス日本矎食芳光客向けグルメアプリ「日本矎食」は、「media」ず「payment」を組み合わせ、蚪日芳光客ず飲食店に今たでにない䜓隓を提䟛しおいたす

PNGファむルの凊理

convert img1.png \( +clone -fill white -draw 'color 0,0 reset' \) +swap -composite img2.png

※whiteの郚分は任意の色のほか、pattern:checkerboardなどの組み蟌みパタヌンも䜿甚可胜

  • 䜿甚蚀語sh、ImageMagick

PNGを䞍透明にする。たたは背景を぀けるために䜿っおいたす。

Gitコマンドを匷化する

`gs` & `gd` from https://github.com/scmbreeze/scm_breeze/
  • 䜿甚蚀語bash

SCM BreezeはGitを䟿利に利甚できる機胜を提䟛しおくれるシェルスクリプト矀です。gsずgdはそれぞれgit statusずgit diffの機胜を匷化したものになっおいたす。倧半はショヌトカット系の機胜です

おわりに

「たった1行のプログラム」ず䟮るなかれ。デヌタ集蚈からプロセス操䜜、画像加工たで、ワンラむナヌで実珟できる凊理は倚皮倚様です。本皿のコヌドを参考にしお、あなたの「オレオレ・ワンラむナヌ」を䜜り出しおみおください。

線集䞭薗明サムラむト

若手ハむキャリアのスカりト転職