コマンドを使用してPostgreSQLサーバーを起動しようとすると、/usr/pgsql-9.2/bin/postgres
終了値codeが表示されます130
。
ただし、このコマンドの終了コードに関するドキュメントが見つかりません。どういう意味ですか130
?
ちなみに、このコマンドはJavaコードで実行され、デフォルトでは次のようになります。
Process dbProcess = Runtime.getRuntime().exec(cmd);
...
int exitCode = dbProcess.exitValue();
答え1
LinuxとOpenJDKの使用少なくとも返される値は、exitValue()
orのようなシェルとほとんどの実装(orではない)がその変数に割り当てる値と同じです。zsh
bash
sh
ksh93
yash
$?
つまり、次のようになります。
- プロセスが次の下位8ビットで終了する場合
exit(n)
:(return n
)。main()
n
n & 0xFF
- プロセスが信号によって終了する場合
n
:n + 128
。
したがって、数字130を取得すると、プロセスがシグナル2で終了したのか、それとも実行されたのかわからないため、あいまいさがありますexit(130)
。
しかし、多くのシェルは持っている規則に従うので、128 + signal_number
プログラムは終了コードとして128より高い値を使用しないことを知っています(またはそうするとき、誰かexit(130)
のようにシグナル2によって死亡した子供の死を報告することがあります)シェル)。
したがって、ここでプロセスは信号2によって終了する可能性が高くなります。次のコマンドを実行して、信号が何であるかを知ることができます。
$ kill -l 130
INT
POSIXスタイルのシェルのプロンプトから。
ほとんどのシステムでは、シグナル2はSIGINTです。これは、端末でCtrl-Cを押したときに端末のフォアグラウンドプロセスグループに送信される信号です。
$ sleep 10
^C
$ echo "$?"
130
SIGINTはターミナル割り込みのために予約する必要があり、アプリケーションはそれを他のプロセスに転送してはいけませんが、そうすることを防ぐ方法はないのでkill(postgres_pid, SIGINT)
(kill -s INT
またはシェルで)まだ問題が発生する可能性がありますkill -INT
。kill -2
$ sleep 10 &
[1] 20171
$ kill -s INT "$!"
[1] + interrupt sleep 10
$ wait "$!"
$ echo "$?"
130