Неубиваемая Java-программа - PullRequest
0 голосов
/ 28 октября 2009

Я разработал приложение в Java. Мне нужно, чтобы моя Java-программа не прервала работу любого проводника процессов / диспетчера задач.

Ответы [ 7 ]

7 голосов
/ 28 октября 2009

Как уже говорили другие, это невозможно. Рэймонд Чен из Microsoft дал хорошее объяснение, почему.

6 голосов
/ 28 октября 2009

Не возможно ...

Возможно, есть способы скрыть его от диспетчера задач или даже других проприетарных процессоров для окон, но для этого нужен доступ к собственному API win32.

Возможно, вы можете использовать JNI (собственный интерфейс Java) для достижения этой цели, но я все еще скептически отношусь.

и плюс сама JVM - это процесс, который, конечно, можно убить.

5 голосов
/ 28 октября 2009

Даже если бы это было возможно, вы даже не должны хотеть (не говоря уже о "необходимости") сделать это .

Единственное, чего он может добиться, это разозлить пользователей и, возможно, вызвать юридические проблемы. Нет законных причин для этого, так что не надо.

2 голосов
/ 28 октября 2009

Вы можете взглянуть на rmid. Я думаю, вы можете сделать так, чтобы он автоматически перезапускал ваш сервис, когда он выходил из строя. Насколько я помню, именно это часто использовалось в Jini.

(Так что это даст вам внешний наблюдатель, основанный только на инструментах Java. Вопрос, конечно, в том, что вы будете делать, когда умирает сам rmid. Я думаю, что делать что-то умное с cron. и так далее.)

2 голосов
/ 28 октября 2009

Я считаю, что это невозможно.

ОС всегда должна иметь возможность управлять приложением, что может привести к их завершению.

1 голос
/ 28 октября 2009

Это возможно в VC ++ и других языках, потому что у вас есть возможность подключиться непосредственно к самой ОС. Java-программы всегда проходят через JVM в качестве промежуточного уровня, и если бы вам удалось подключить это глубоко к чьей-либо машине через JVM, как говорили люди, это было бы огромной дырой в безопасности:

Краткая версия: Если вам абсолютно необходимо это сделать, делайте это на языке, который компилирует собственные двоичные файлы и не имеет виртуальной машины между вами и API ОС.

1 голос
/ 28 октября 2009

Это невозможно.

Самое близкое, чего вы можете достичь, - это добавить в свою Java-программу отключающий хук, который будет блокироваться бесконечно; например Runtime.getRuntime().addShutdownHook(Thread).

Это повлияет на то, что обычный сигнал уничтожения в Posix не будет действовать. Из диспетчера задач Windows попытка «Завершить процесс» не удастся, и Windows в конечном итоге предложит указать, что процесс не отвечает, и вы хотите прекратить его - на данный момент нет способа предотвратить завершение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...