TL;DR
- Linux環境で、たまに終了ステータスが100を越えるような数字を見ることがある
- これはシグナルを受けて終了した場合で、どのようなシグナルを受け取ったかは128を引いてみればよい
お題
Ubuntu Linux 18.04 LTSで試してみます。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
例えば、以下のようなJavaプログラムを書いてみます。
App.java
import java.util.concurrent.TimeUnit;
public class App {
public static void main(String... args) throws InterruptedException {
while (true) {
TimeUnit.SECONDS.sleep(3L);
System.out.println("waiting...");
}
}
}
終了しないプログラムですね。
これをコンパイルして
$ javac App.java
実行。
$ java App
waiting...
waiting...
適当なところで、Ctrl-cで止めます。
^C
この時の終了ステータスを見ると、"130"となります。
$ echo $?
130
130ってなんでしょう?
この部分を見てみます。
| 128+n | シグナル n で終了 |
というわけで、シグナルを送って強制終了したプログラムなので、実際にどのようなシグナルが送られたかは128を引けばわかるというわけです。
シグナルの一覧を見てみましょう。
$ 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
130 - 128 = 2(SIGINT)、つまり割り込み(interrupt)です。
Ctrl-Cで割り込んだので、一致しますね。
というわけで、こういうケースは128を引けばよい、と知っておくとよいでしょう。