명령을 사용하여 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