Как заставить сработать хук завершения процесса, запущенного из Eclipse?
У меня есть хук завершения работы в моем приложении (созданный с использованием Runtime.getRuntime().addShutdownHook
). Однако, когда я запускаю приложение из Eclipse, при завершении приложения хук не выполняется.
Я думаю, что это происходит потому, что Eclipse отправляет эквивалент принудительного завершения процесса, что не вызывает выполнение хука завершения работы (аналог команды taskkill /F в Windows или kill -p в Linux), хотя я не совсем уверен.
Кто-нибудь знает, как это обойти? Я использую Windows (Vista), и у меня есть ощущение, что это может быть проблемой, связанной с Windows, но я не уверен.
5 ответ(ов)
Вы можете использовать следующий хак в конце вашего основного метода, чтобы обойти проблему:
if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE"))) {
System.out.println("Вы используете Eclipse; кликните в этот консоль и " +
"нажмите ENTER, чтобы вызвать System.exit() и запустить процедуру завершения.");
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
Этот код проверяет, запущено ли ваше приложение в среде Eclipse, и, если это так, дает пользователю возможность вручную завершить программу, нажав ENTER. Это может помочь избежать потенциальных проблем с автоматическим завершением программы в среде разработки. Надеюсь, это вам поможет!
Вы можете использовать следующий скрипт, чтобы получить список доступных процессов, запущенных в Eclipse, которые можно завершить. Скрипт осно́ван на bash и может быть выполнен вне Eclipse. Вот его код:
#!/bin/bash
set -o nounset # Обработка неинициализированных переменных как ошибки
PROCESSES=$(ps axo pid,ppid,command)
# Получение PID лаунчера Eclipse
LAUNCHER_PID=$(echo "$PROCESSES" | grep "/usr/lib/eclipse/eclipse" | grep -v "launcher" | awk '{print $1}')
echo "Launcher PID $LAUNCHER_PID"
# Получение PID самого Eclipse
ECLIPSE_PID=$(echo "$PROCESSES" | egrep "[[:digit:]]* $LAUNCHER_PID " | awk '{print $1}')
echo "Eclipse PID $ECLIPSE_PID"
# Получение PID субпроцессов Eclipse
SUB_PROCESS=$(echo "$PROCESSES" | egrep "[[:digit:]]* $ECLIPSE_PID " | awk '{print $1}')
# Вывод списка процессов
echo
for PROCESS in $SUB_PROCESS; do
DRIVER=$(ps --no-headers o pid,ppid,command $PROCESS | awk '{print $NF}')
echo "$PROCESS $DRIVER"
done
echo "Чтобы завершить процесс, используйте: 'kill -SIGTERM \$PID'"
Не забудьте, что перед запуском скрипта стоит проверить путь к вашему экземпляру Eclipse, так как он может отличаться. Также, чтобы завершить процесс, замените \$PID
на соответствующий идентификатор процесса, который вы хотите остановить.
Я не совсем уверен, как это исправить, но в IntelliJ добавили отдельную кнопку в диалоговом окне 'Запуск', которая завершает работу виртуальной машины так, чтобы вызывались хуки завершения (Shutdown Hooks). Однако у отладчика этой функции нет.
Сейчас я застрял в WebSphere и не вижу того, что ищу. Но помню, что в Eclipse есть опция конфигурации запуска, связанная с запуском приложения в том же виртуальном компьютере (VM).
Возможно, вы запускаете ваше Java-приложение в том же VM, что и VM Eclipse?
Я не могу припомнить, где именно находится эта опция, но, возможно, что-то из этого поможет вам ее найти. Если вам нужно больше деталей, попробуйте поискать в настройках конфигурации запуска (Run Configurations) в Eclipse.
Да, Сайрам прав. Вызвав System.exit(0), мы можем завершить JVM Eclipse и увидеть результаты shutdown hook. Это полезно, если вы хотите выполнить какие-либо чистящие операции перед завершением работы программы. Не забудьте, что при использовании этого метода все запущенные потоки будут остановлены, и приложение завершится немедленно.
Ошибка «Необходимо переопределить метод суперкласса» после импорта проекта в Eclipse
Необходимый компилятор в данной среде отсутствует. Возможно, вы используете JRE вместо JDK?
Очистка выделения покрытия кода в Eclipse
IntelliJ: Показать подсказки JavaDocs при наведении мыши
Eclipse: Как установить максимальную длину строки для автоматического форматирования?