sitateru tech blog: Linux

sitateru tech blog

シタテルの技術やエンジニアの取り組みを紹介するテックブログです。

ラベル Linux の投稿を表示しています。 すべての投稿を表示
ラベル Linux の投稿を表示しています。 すべての投稿を表示

2019年4月23日火曜日

同時に複数のマシーンで同じ操作をする with Tmux

4月 23, 2019



sitateruのエンジニア北爪です。

複数のシェルで同じ操作をしたい時ってないですか?
  • ログを一箇所に集めてないけど、アプリケーションサーバーが複数台ある
  • 複数台同時にtopコマンドで負荷をまたはtailコマンドでログを調査したい

など調査段階でAnsible, Fabやcapistranoで操作するほどではなく、複数のサーバーを同じようにインタラクティブに操作したいという要求はあるように思います。

今回は複数のシェルに対して、分割された画面をみなが同時に操作、そのコマンドラインの結果を参照することが可能です。

tmuxを風にいうと、一つのpaneに行うキーボード操作をそのpaneが存在しているWindow内すべてのpaneキーボード操作を同期することができます

この機能は、tmuxの synchronize-panes 機能です。tmuxを使ってない人には導入する大きなメリットの一つになるのではないかとお思います。デフォルトです。

http://man.openbsd.org/OpenBSD-current/man1/tmux.1#synchronize-panes

使い方

1. tmuxを起動し、複数のpaneを作成がある状態で
2. tmuxにbindしてあるtmuxのprefixキーを入力した後で、 `:` を入力します
(余談私は ctrl-t にしています)

# act like GNU screen                                                                                                                                       
unbind C-b                                                                                                                                                  

set -g prefix C-t  

3. tmux用のコマンドが立ち上がるので、そこに、 set synchronize-panes onを入力します。
4. そうするとなんと!表示されているpane(分割した画面) に同じキーボード操作が入力されます
5. もう同期したくなくなったら、 set synchronize-panes off にて解除することが可能です。

以上です。



2019年1月21日月曜日

Linuxのプロセス確認方法3つと終了方法3つ -killコマンドのバリエーション-

1月 21, 2019
Photo by Sai Kiran Anagani on Unsplash

元インフラエンジニアの北爪です。

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とセットで使うことでどのプロセスが対象になるのかを事前に調べることができます。 pgreppkill はオプションを共有しているので、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


終わりです!