Невозможно открыть селектор в солярисе для пользователя без полномочий root - PullRequest
1 голос
/ 02 сентября 2010

У меня есть серверное приложение, которое работает в большинстве случаев нормально, но на одной машине Solaris оно не может открыть селектор, для пользователя root оно работает нормально.для другого пользователя это дает следующее исключение

java.io.IOException: Permission denied
at sun.nio.ch.DevPollArrayWrapper.init(Native Method)
at sun.nio.ch.DevPollArrayWrapper.<init>(DevPollArrayWrapper.java:74)
at sun.nio.ch.DevPollSelectorImpl.<init>(DevPollSelectorImpl.java:54)
     at sun.nio.ch.DevPollSelectorProvider.openSelector(DevPollSelectorProvider.java:18)
at java.nio.channels.Selector.open(Selector.java:209)

любые предложения по этому вопросу.

1 Ответ

3 голосов
/ 18 сентября 2010

В отсутствие более полного сообщения об ошибке от собственной обертки, используйте truss, чтобы определить системный вызов низкого уровня, который завершается неудачно (наиболее вероятно, с EACCES), при этом работая какnon- root user:

truss -l -d -f -vall -wall -o truss.out java ... TestOrAppClass

То, что вы ожидаете увидеть в truss.out после того, как приложение Java сгенерирует исключение и завершится (или прекратит работу) - обратите внимание на чередующиеся пробелы в I O E x c e p t i o n:

...
...
...
...
23515/1:         0.2912 some_system_call(params)                        Err#13 EACCES [ALL]
...
23515/1:         0.2923 write(2, 0x08044F84, 39)                        = 39
23515/1:           j a v a . i o . I O E x c e p t i o n :   P e r m i s s i o n
23515/1:           d e n i e d
...
...
...
...

Если рассматриваемое приложение слишком сложное и генерирует слишком много выходных данных (или иным образом сложно вызвать из командной строки), то напишите и скомпилируйте небольшой тестовый класс, который воспроизводит проблему, вызывая java.nio.channels.Selector.open() напрямую.

Если вы не можете / не можете написать простой тестовый класс, помните, что вы всегда можете использовать дополнительный вывод, зарегистрированный с помощью опции -wall, для корреляции времени (и потока / LWP), в котороераспечатка трассировки стека была произведена с фактическим системным вызовом, который должен был произойти незадолго до этого.

В приведенном выше примере truss.out,23515 - это идентификатор процесса, /1 - это идентификатор LWP (удваивается как идентификатор «нити», если JVM использует собственные потоки, что почти наверняка происходит в Solaris), 0.2912 - метка времени (в секундах с момента java).запуск процесса / трассировки), и some_system_call сбой при EACCES является вызовом интереса.

Какую версию JDK вы используете?

...