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つのフィールドは、答えを教えてくれます.
SとCは、信号を受信したことを示し、脱退せざるを得ない場合、EXCフィールドレコードはプロセスの脱退を招く信号値である.
本例では、ST=NSは、信号が受信されたことを示して終了し、EXC=10は、10番信号が受信されたことを示す.
3.終わり
誰がceph-osdプロセスにSIGUSR 1信号を送ったのか、systemtapが手伝うことができます.
プロセスに送信されたすべての信号を監視するスクリプトを作成します.
テストでは、次のように出力されます.
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