0

Как заставить сработать хук завершения процесса, запущенного из Eclipse?

1

У меня есть хук завершения работы в моем приложении (созданный с использованием Runtime.getRuntime().addShutdownHook). Однако, когда я запускаю приложение из Eclipse, при завершении приложения хук не выполняется.

Я думаю, что это происходит потому, что Eclipse отправляет эквивалент принудительного завершения процесса, что не вызывает выполнение хука завершения работы (аналог команды taskkill /F в Windows или kill -p в Linux), хотя я не совсем уверен.

Кто-нибудь знает, как это обойти? Я использую Windows (Vista), и у меня есть ощущение, что это может быть проблемой, связанной с Windows, но я не уверен.

5 ответ(ов)

0

Вы можете использовать следующий хак в конце вашего основного метода, чтобы обойти проблему:

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. Это может помочь избежать потенциальных проблем с автоматическим завершением программы в среде разработки. Надеюсь, это вам поможет!

0

Вы можете использовать следующий скрипт, чтобы получить список доступных процессов, запущенных в 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 на соответствующий идентификатор процесса, который вы хотите остановить.

0

Я не совсем уверен, как это исправить, но в IntelliJ добавили отдельную кнопку в диалоговом окне 'Запуск', которая завершает работу виртуальной машины так, чтобы вызывались хуки завершения (Shutdown Hooks). Однако у отладчика этой функции нет.

0

Сейчас я застрял в WebSphere и не вижу того, что ищу. Но помню, что в Eclipse есть опция конфигурации запуска, связанная с запуском приложения в том же виртуальном компьютере (VM).

Возможно, вы запускаете ваше Java-приложение в том же VM, что и VM Eclipse?

Я не могу припомнить, где именно находится эта опция, но, возможно, что-то из этого поможет вам ее найти. Если вам нужно больше деталей, попробуйте поискать в настройках конфигурации запуска (Run Configurations) в Eclipse.

0

Да, Сайрам прав. Вызвав System.exit(0), мы можем завершить JVM Eclipse и увидеть результаты shutdown hook. Это полезно, если вы хотите выполнить какие-либо чистящие операции перед завершением работы программы. Не забудьте, что при использовании этого метода все запущенные потоки будут остановлены, и приложение завершится немедленно.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь