atopプロセス終了情報の取得

3739 ワード

転載:http://bean-li.github.io/atop-exit-code/
1.はじめに
Daemonプロセスは未明に理由もなく終了し、logには終了の原因を判断する有効な情報はありません.QAは私に脱退の原因を確定して、信号を受け取って殺されたのか、それとも自分が異常に脱退したのかを確認した.
幸いatopがあり、プロセスの終了コードや受信した信号値が記録されます.
2.方法
次の図を参照してください.
image.png
上の図の最初の行#exit 20305は、過去10分以内に20305のプロセスが終了したことを示しています.
この行は、2つのサンプリングポイントの間にceph-osdが終了したことを示し、<>保護されたプロセスは終了したプロセスを示します.正常に終了したのか、それとも信号を受信したのか、前者であれば、その戻り値はいくらなのか、後者であれば、どんな信号を受信したのか.
atopのSTとEXCの2つのフィールドは、答えを教えてくれます.
ST
The status of a process.
The first position indicates if the process has been started during the last interval (the value N means 'new process').
The second position indicates if the process has been finished during the last interval.
The value E means 'exit' on the process' own initiative; the exit code is displayed in the column 'EXC'.
The value S means that the process has been terminated unvoluntarily by a signal; the signal number is displayed in the in the column 'EXC'.
The value C means that the process has been terminated unvoluntarily by a signal, producing a core dump in its current directory; the signal number is displayed in the column 'EXC'.

SとCは、信号を受信したことを示し、脱退せざるを得ない場合、EXCフィールドレコードはプロセスの脱退を招く信号値である.
EXC
The exit code of a terminated process (second position of column 'ST' is E) or the fatal signal number (second position of column 'ST' is S or C).

本例では、ST=NSは、信号が受信されたことを示して終了し、EXC=10は、10番信号が受信されたことを示す.
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

3.終わり
誰がceph-osdプロセスにSIGUSR 1信号を送ったのか、systemtapが手伝うことができます.
プロセスに送信されたすべての信号を監視するスクリプトを作成します.
probe begin
{
  printf("%-30s%-8s %-16s %-8s %-16s %6s %-16s
", "TIME","SPID", "SNAME", "RPID", "RNAME", "SIGNUM", "SIGNAME") } probe signal.send { if (pid_name == @1) printf("%-30s%-8d %-16s %-8d %-16s %6d %-16s
", ctime(gettimeofday_s()),pid(), execname(), sig_pid, pid_name, sig, sig_name) }**
stap sigmon.stap ceph-osd

テストでは、次のように出力されます.
$ stap sigmon.stp ceph-osd
TIME                          SPID     SNAME            RPID     RNAME            SIGNUM SIGNAME         
Wed Nov  2 14:21:15 2016      19977    sh               19884    ceph-osd             17 SIGCHLD         
Wed Nov  2 14:21:15 2016      19992    sh               19884    ceph-osd             17 SIGCHLD         
Wed Nov  2 14:21:20 2016      21218    sh               19884    ceph-osd             17 SIGCHLD         
Wed Nov  2 14:21:20 2016      21224    sh               19884    ceph-osd             17 SIGCHLD         
Wed Nov  2 14:21:22 2016      9786     bash             19884    ceph-osd             10 SIGUSR1