2019年1月21日月曜日
Linuxのプロセス確認方法3つと終了方法3つ -killコマンドのバリエーション-
1月 21, 2019

元インフラエンジニアの北爪です。
Linuxにてプロセスを終了する様々な方法について解説します。最後にプロセスを終了するとはどういうことかを説明します。
最初にプロセス終了コマンドとプロセスの確認コマンドをそれぞれ3つ紹介します。
その後に終了コマンドを詳しく解説し、最後にUNIXのシグナルについて簡単に解説します。
プロセスの確認コマンド3つ
- リアルタイムでインタラクティブなプロセス確認方法、
top
コマンド - Linuxならパイプで繋ぎたいそんな確認方法は
ps auxf
コマンド - パターンマッチで調べたい
pgrep -a
コマンド
プロセスの終了コマンド3つ
- インタラクティブにプロセスを終了するなら、
top
コマンド - pidを見て確認しながらプロセスを終了するなら
kill
コマンド - pidを確認するのと同時にプロセスを終了するなら
pkill
コマンド
topコマンド -インタラクティブにkill-
プロセスの状況を確認しながら、特定のプロセスを終了することができます。topコマンドを起動し、k
を押すと、pidが聞かれた後に、送りたいシグナルを入力することができます。最後に確認(yes/no)が出て、プロセスを終了できます。killコマンド -丁寧にkill-
ps aux | grep <プロセス名>
もしくは、pgrep <プロセス名>
にてpidを調べます。調べたpidを使って、kill -p <pid>
にてプロセスを終了することができます。pkillコマンド -patternでkill
プロセス名をパターンマッチングして終了ことができます。同時にマッチした複数のプロセスを終了することができます。例えば、nginxが起動しており、master(親プロセス)とworker(子プロセス)が実行されているとします。以下のようになります。
root@0e1d355b28f0:/# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 18504 3528 pts/0 Ss 10:03 0:00 /bin/bash
root 3470 0.0 0.0 140624 1520 ? Ss 10:11 0:00 nginx: master process /usr/sbin/nginx
www-data 3471 0.0 0.1 141000 3428 ? S 10:11 0:00 \_ nginx: worker process
www-data 3472 0.0 0.1 141000 3428 ? S 10:11 0:00 \_ nginx: worker process
pkill nginx
これでnginxのプロセスを終了することができます。また、
-f
オプションでは、プロセス名だけではなく、オプションを含めた全てのプロセス名がパターンマッチの対象になります。pkill
は、pgrep
とセットで使うことでどのプロセスが対象になるのかを事前に調べることができます。 pgrep
とpkill
はオプションを共有しているので、pgrepにて対象のプロセスを調べることができます。pgrepにてプロセスの探し方をオプションなしでプロセス名にて検索、
-f
オプションにてプロセス名全体にて検索の例を示します。-a オプションはプロセスの説明を表示します。root@0e1d355b28f0:/# root@0e1d355b28f0:/# ps auxf | grep nginx
root 3789 0.0 0.0 140624 1512 ? Ss 10:57 0:00 nginx: master process /usr/sbin/nginx
www-data 3790 0.0 0.1 141000 3384 ? S 10:57 0:00 \_ nginx: worker process
www-data 3791 0.0 0.1 141000 3384 ? S 10:57 0:00 \_ nginx: worker process
root@0e1d355b28f0:/# pgrep -a nginx
3789 nginx: master process /usr/sbin/nginx
3790 nginx: worker process
3791 nginx: worker process
root@0e1d355b28f0:/# pgrep -a -f master
3789 nginx: master process /usr/sbin/nginx
root@0e1d355b28f0:/# pgrep -a -f worker
3790 nginx: worker process
3791 nginx: worker process
次に、意図的に、先にnginxのmasterプロセスにSIGKILLをシグナルを送り、親プロセスのみ強制終了します(シグナルについては後述)。そのあとに親プロセスが消えた子プロセス(= Orphan process)のwoker(子プロセス)を
pkill -f
を使って終了してみます。root@0e1d355b28f0:/# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 18616 3552 pts/0 Ss 10:03 0:00 /bin/bash
root 3789 0.0 0.0 140624 1512 ? Ss 10:57 0:00 nginx: master process /usr/sbin/nginx
www-data 3790 0.0 0.1 141000 3384 ? S 10:57 0:00 \_ nginx: worker process
www-data 3791 0.0 0.1 141000 3384 ? S 10:57 0:00 \_ nginx: worker process
root 3805 0.0 0.1 34396 2828 pts/0 R+ 11:02 0:00 ps auxf
root@0e1d355b28f0:/# pkill -KILL -f master
root@0e1d355b28f0:/# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 18616 3552 pts/0 Ss 10:03 0:00 /bin/bash
www-data 3790 0.0 0.1 141000 3384 ? S 10:57 0:00 nginx: worker process
www-data 3791 0.0 0.1 141000 3384 ? S 10:57 0:00 nginx: worker process
root 3807 0.0 0.1 34396 2792 pts/0 R+ 11:02 0:00 ps auxf
root@0e1d355b28f0:/# pkill -KILL -f worker
root@0e1d355b28f0:/# ps auxf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 18616 3552 pts/0 Ss 10:03 0:00 /bin/bash
root 3809 0.0 0.1 34396 2944 pts/0 R+ 11:02 0:00 ps auxf
プロセスの終了とは シグナルについて
プロセスの終了は各プロセスにシグナルを送ることで外部から非同期にプロセスのコントロールを行います。top
kill
pkill
全てのコマンドでデフォルトのシグナル(SIGTERM/15)です。つまり、TERMシグナルを送ることで、プロセスを終了しています。TERM以外のシグナルを送ることも可能です。各シグナルは番号と英語による表記があります。
kill
pkill
共に -<signal>
にてシグナルを送ることができます。これは数字でも文字でも可能です。例えば、強制終了はkill -KILL
もしくは kill -9
kill -l
コマンドでシグナルの一覧を出力することが可能です。root@0e1d355b28f0:/# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
終わりです!
2018年12月13日木曜日
ec2のインスタンスログインを簡単に管理する ~EC2 with Peco ~
12月 13, 2018
sitateruでサービス・プロダクトを担当している北爪です。
インフラを見ることもあり、ec2サーバーのアドレス管理についてCLIで行う方法を紹介します。
目的
ec2のインスタンスはアドレスが構築するたびに変わり、負荷や新しいプロジェクトが立ち上がると増えたり減ったりします。
そのため、動的にサーバーアドレスを取得する必要があります。
AWS consoleに入ることなく、awsコマンドからサーバーリストを取得し、CLI filterのpecoを使って、SSHまでおこないます。
使い方
Command+\
でpecoを起動
やじるしの ↑↓
か、キーワードで絞る
SSHするサーバーを選んでEnterを押す
SSHコマンドがはかれる
準備
zshを使っているのを前提に説明します。
必要ソフトのインストール
Shellの設定
ec2 コマンドを作る
AWS CLIから、ec2をリスト化するコマンドを作成し、shellに設定します。(zshrc)
alias ec2="aws ec2 describe-instances --query 'Reservations[].Instances[].{PublicDnsName:PublicDnsName,InstanceId:InstanceId,Tags:Tags[?Key==\`Name\`].Value|[0],InstanceType:InstanceType,State:State.Name}' --output table"
peco-ec2コマンドを作る
zshrc
にpeco-ec2
をつくります- ログインユーザーをdeployにしています
function peco-ec2 () {
local selected=$(ec2 | peco --query "$LBUFFER")
if [ -n "$selected" ]; then
BUFFER="ssh deploy@$(echo $selected | awk 'match($0, /ec2.*\.amazonaws\.com/) {print substr($0, RSTART, RLENGTH)}')"
zle accept-line
fi
zle clear-screen
}
- さらに、好きなキーにバインドします。
- ここでは、
Command-\
につけています
zle -N peco-ec2
bindkey '^\' peco-ec2
まとめ
ec2をリスト化し、すぐにそこからsshを選べるようにしました。
登録:
投稿 (Atom)