У меня есть приложение ServerSocket, которое завершается, когда пользователь вводит Ctrl + C на терминале.Очистка завершения приложения выглядит нормально, но когда я пытался увидеть возвращенный код процесса, он выдает код ошибки 143 для SIGTERM
и 130 для SIGINT
. Я бы хотел, чтобы процесс возвратил 0, потому что задание было успешно выполнено .
Мой код:
public class Application {
public static void main(String[] args) {
WebService webService = new WebService(9999);
Thread serviceThread = new Thread(webService);
serviceThread.start();
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
webService.stop();
try {
serviceThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}));
}
}
public class WebService implements Runnable {
private int port;
private ServerSocket socket;
public WebService(int port) {
this.port = port;
}
@Override
public void run() {
try {
socket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
while (!socket.isClosed()) {
try {
socket.accept();
System.out.println("New client connected!");
} catch (IOException e) {
if (!socket.isClosed())
e.printStackTrace();
break;
}
}
cleanup();
}
private void cleanup() {
System.out.println("Stopping server");
for (int i = 0; i < 3; i++) {
try {
System.out.print(".");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("\nServer stopped!");
}
public void stop() {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Running the application:
$ java -jar App.jar || echo $?
Stopping server
...
Server stopped!
130
Отправка сигнала в приложение:
kill -s SIGINT <pid>