java无法在solaris中为非root用户打开选择器
我有一个服务器应用程序,在大多数情况下运行良好,但在一台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 楼答案
在本机包装器没有更全面的错误消息的情况下,使用^{} 标识在以非
root
用户身份运行时失败的低级系统调用(最有可能是EACCES
):Java应用程序抛出异常并终止(或终止)后
truss.out
中的预期内容请注意I O E x c e p t i o n
中的交错空格:如果所讨论的应用程序太复杂,生成的输出太多(或者很难从命令行调用),那么编写并编译一个小的测试类,该类通过直接调用
java.nio.channels.Selector.open()
来重现问题如果您不/不能编写简单的测试类,那么请记住,您可以始终使用
-wall
选项记录的额外输出,将生成堆栈跟踪打印输出的时间(和线程/LWP)与实际的系统调用关联起来,而实际的系统调用应该在不久之前失败在上面的样本
truss.out
输出中,23515
是进程ID,/1
是LWP ID(如果JVM使用本机线程,则加倍为“线程”标识符,这几乎可以肯定在Solaris上是这样做的),0.2912
是时间戳(自java
进程/跟踪启动后的秒数),而some_system_call
失败的EACCES
是感兴趣的调用您使用的是哪个版本的JDK