Linux服务器导出报java.lang.RuntimeException: java.io.IOException: Permission denied

  1. 报错信息
java.lang.RuntimeException: java.io.IOException: Permission denied
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:688)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:676)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
	at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
	at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
	at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
	at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
	at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
	at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
	at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
	at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1722)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Permission denied
	at java.io.UnixFileSystem.createFileExclusively(Native Method)
	at java.io.File.createTempFile(File.java:2024)
	at org.apache.poi.util.DefaultTempFileCreationStrategy.createTempFile(DefaultTempFileCreationStrategy.java:110)
	at org.apache.poi.util.TempFile.createTempFile(TempFile.java:66)
	at org.apache.poi.xssf.streaming.GZIPSheetDataWriter.createTempFile(GZIPSheetDataWriter.java:55)
	at org.apache.poi.xssf.streaming.SheetDataWriter.<init>(SheetDataWriter.java:72)
	at org.apache.poi.xssf.streaming.SheetDataWriter.<init>(SheetDataWriter.java:77)
	at org.apache.poi.xssf.streaming.GZIPSheetDataWriter.<init>(GZIPSheetDataWriter.java:47)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheetDataWriter(SXSSFWorkbook.java:339)
	at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:80)
	at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:684)
	... 83 more
  1. 出现该问题的原因:

前提条件:项目为非root用户启动
导出excle时在没有人为干预导出目录时,依赖临时目录,非root权限启动的项目导出excle临时目录(/tmp)没权限(服务器临时目录只对root权限下起作用)

  1. 解决方法:

在root用户下,将临时目录为/tmp,设置所有人可以读写

#设置所有人可以读写
chmod -R 666 /tmp/
 
#或设置所有人可以读写及执行
chmod -R 777 /tmp/
### Java IOException 和 Azkaban 执行服务器中的权限问题分析 在 Hadoop 或 Spark 集群环境中运行 Java 程序时,`java.io.IOException: Permission denied` 错误通常表明当前进程无法访问所需的文件或目录。此问题可能由多种原因引起,包括但不限于操作系统级别的权限设置、HDFS 文件系统的权限控制以及 Azkaban 调度器的任务执行环境。 #### 1. **操作系统的权限管理** 当尝试创建文件或写入特定路径时,如果目标位置的权限不允许当前用户进行这些操作,则会抛出 `Permission denied` 的异常。例如,在 Linux 中,即使是以 root 用户身份启动服务,某些子进程可能会继承较低权限的上下文[^1]。因此,建议检查以下几点: - **确认文件系统权限** 使用命令如 `ls -l /path/to/file` 查看目标文件或目录的具体权限,并确保它们允许所需的操作。 - **调整权限** 如果发现权限不足,可以使用 `chmod` 命令更改文件或目录的权限。例如: ```bash chmod 755 /path/to/directory ``` - **验证 SELinux/AppArmor 设置** 在一些安全增强型 Linux 发行版中,SELinux 或 AppArmor 可能会对文件访问施加额外限制。可以通过临时禁用 SELinux 测试是否解决问题: ```bash setenforce 0 ``` #### 2. **Azkaban 日志中的 Error=13** Azkaban 是一种常见的工作流调度工具,其任务执行过程中可能出现类似的权限错误。根据描述,“Error=13” 表明 Shell 脚本或其他外部程序缺乏可执行权限[^2]。以下是解决方案: - **赋予脚本执行权限** 修改相关脚本的权限以支持读取和执行操作: ```bash chmod +x import_t_usermail.sh ``` - **检查作业提交用户的权限** 确认 Azkaban Server 运行所使用的用户是否有权访问并执行指定资源。这涉及两个方面:一是本地磁盘上的文件;二是远程存储(如 HDFS)中的数据集。 #### 3. **Hadoop/Azkaban 结合场景下的注意事项** 对于分布式计算框架而言,除了单机层面的因素外还需要关注跨节点协作期间产生的冲突情况。具体来说: - **统一 Umask 值** 默认情况下新建文件默认掩码 (umask) 影响新生成对象初始状态。推荐显式定义 umask 参数来标准化行为模式: ```bash export HADOOP_USER_NAME=hdfs && umask 0022; hdfs dfs -mkdir ... ``` - **同步 Kerberos 认证票据** 若启用了基于 Kerberos 的安全性机制,则需定期刷新 kinit 凭据以免超期失效引发拒绝访问状况。 --- ```python import subprocess def execute_shell_command(command): try: result = subprocess.run( command, shell=True, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) return result.stdout.strip() except subprocess.CalledProcessError as e: raise Exception(f"Command failed with error {e.stderr}") # Example usage of the function to change permissions programmatically. execute_shell_command("chmod +x /path/to/script.sh") # Ensure script is executable. ``` 上述代码片段展示了如何通过 Python 实现自动化处理权限变更逻辑,从而减少人为干预带来的潜在失误风险。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值