zoukankan      html  css  js  c++  java
  • kettle 执行 kjb 临时文件夹 /tmp permission denied 问题

    编写完的 kettle job (kjb文件) 放在服务器上执行的时候出现了奇怪的错误:

    # 执行 kjb
    ./kitchen.sh -file:/opt/code/ods/ods_inc.kjb
    
    # 错误日志
    2020/11/10 20:15:40 - TableAccountingState - Running on platform : Linux
    2020/11/10 20:15:40 - TableAccountingState - Executing command : /tmp/kettle_72e89b17-234e-11eb-8b7e-49ea52dd39e5shell
    2020/11/10 20:15:40 - TableAccountingState - ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : Error running shell [null] : java.io.IOException: Cannot run program "/tmp/kettle_72e89b17-234e-11eb-8b7e-49ea52dd39e5shell": error=13, Permission denied
    2020/11/10 20:15:40 - TableAccountingState - ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : java.io.IOException: Cannot run program "/tmp/kettle_72e89b17-234e-11eb-8b7e-49ea52dd39e5shell": error=13, Permission denied
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    2020/11/10 20:15:40 - TableAccountingState -    at org.pentaho.di.job.entries.shell.JobEntryShell.executeShell(JobEntryShell.java:595)
    2020/11/10 20:15:40 - TableAccountingState -    at org.pentaho.di.job.entries.shell.JobEntryShell.execute(JobEntryShell.java:435)
    2020/11/10 20:15:40 - TableAccountingState -    at org.pentaho.di.job.Job.execute(Job.java:686)
    2020/11/10 20:15:40 - TableAccountingState -    at org.pentaho.di.job.Job.access$000(Job.java:121)
    2020/11/10 20:15:40 - TableAccountingState -    at org.pentaho.di.job.Job$1.run(Job.java:804)
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.Thread.run(Thread.java:748)
    2020/11/10 20:15:40 - TableAccountingState - Caused by: java.io.IOException: error=13, Permission denied
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.UNIXProcess.forkAndExec(Native Method)
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    2020/11/10 20:15:40 - TableAccountingState -    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    2020/11/10 20:15:40 - TableAccountingState -    ... 6 more
    2020/11/10 20:15:40 - ods_inc_test - Finished job entry [Flag] (result=[false])
    2020/11/10 20:15:40 - ods_inc_test - Finished job entry [Get Date] (result=[false])
    2020/11/10 20:15:40 - ods_inc_test - Job execution finished
    2020/11/10 20:15:40 - Kitchen - Finished!
    2020/11/10 20:15:40 - Kitchen - ERROR (version 8.3.0.0-371, build 8.3.0.0-371 from 2019-06-11 11.09.08 by buildguy) : Finished with errors
    2020/11/10 20:15:40 - Kitchen - Start=2020/11/10 20:15:35.801, Stop=2020/11/10 20:15:40.738
    2020/11/10 20:15:40 - Kitchen - Processing ended after 4 seconds.
    

    关键错误在于

    Error running shell [null] : java.io.IOException: Cannot run program "/tmp/kettle_72e89b17-234e-11eb-8b7e-49ea52dd39e5shell": error=13, Permission denied
    

    可以看出错误在于没有权限执行/tmp/kettle_72e89b17-234e-11eb-8b7e-49ea52dd39e5shell,这个文件是 kettle 在执行脚本的时候生成的临时文件,但是没有权限执行。

    首先尝试给用户赋予 /tmp 文件夹的可执行权限,但是仍然相同的报错。

    一番查阅资料后发现是由于/tmp文件系统的属性被设置了noexec导致该目录下的程序无法执行。noexec表示对应文件系统不允许执行可执行程序,即使文件具有可执行过权限。通常是考虑安全原因会这么设置。

    那么方法有两个:

    1. 移除/tmpnoexec 属性,但是可能会导致安全隐患
    2. 更改 kettle 生成临时文件的目录,让其在一个有执行权限的文件中生成临时文件。

    第一个方法可能会有安全隐患,/tmp 文件夹是很容易遭受攻击的地方,而且修改了 /etc/fstab 中的配置后需要对 /tmp 进行重新挂在,这时可能有很多程序在使用这个目录,需要停掉使用的服务,一些服务甚至需要重启,在生产环境中不好执行。

    那就想办法修改 kettle 的临时文件目录。

    首先搜索了 kettle 的帮助使用手册和帮助文档,并没有发现有提供对应的入口。

    但是 kettle 是跑在 JVM 上的 java 程序,那么理论上应该可以修改 JVM 启动参数达到目的。

    我们使用 kitchen 执行 kjb 文件(kettle job)实际上就是执行这个 job 中的 kettle transformation,而 kettle transformation 是用 spoon 程序执行的,那么就看一看 spoon.sh(Linux环境下,Windows下则是 spoon.bat)

    在 spoon.sh 中发现这么一段代码:

    # **********************************************************************
    # ** Set java runtime options
    # ** Change 2048m to higher values in case you run out of memory
    # ** or set the PENTAHO_DI_JAVA_OPTIONS environment variable
    # **********************************************************************
     
    if [ -z "$PENTAHO_DI_JAVA_OPTIONS" ]; then
        PENTAHO_DI_JAVA_OPTIONS="-Xms1024m -Xmx2048m"
    fi
     
    OPT="$OPT $PENTAHO_DI_JAVA_OPTIONS 
    -Dhttps.protocols=TLSv1,TLSv1.1,TLSv1.2 
    -Djava.library.path=$LIBPATH 
    -Djava.endor sed.dirs=$JAVA_ENDORSED_DIRS 
    -DKETTLE_HOME=$KETTLE_HOME 
    -DKETTLE_REPOSITORY=$KETTLE_REPOSITORY 
    -DKETTLE_USER=$KETTLE_USER 
    -DKETTLE_PASSWORD=$KETTLE_PASSWORD 
    -DKETTLE_PLUGIN_PACKAGES=$KETTLE_PLUGIN_PACKAGES 
    -DKETTLE_LOG_SIZE_LIMIT=$KETTLE_LOG_SIZE_LIMIT 
    -DKETTLE_JNDI_ROOT=$KETTLE_JNDI_ROOT"
    

    框框的注释中说得很清楚了,这里就是设置 runtime options 的地方,那么我们在 OPT 后面加上 -Djava.io.tmpdir=/opt/code/kettle_tmp 试试。

    java.io.tmpdir 是配置 JVM 默认临时文件输出目录的参数。

    再次执行 ./kitchen.sh -file:/opt/code/ods/ods_inc.kjb 出现一下日志输出:

    2020/11/10 20:22:04 - TableAccountingState - Running on platform : Linux
    2020/11/10 20:22:04 - TableAccountingState - Executing command : /opt/code/kettle_tmp/kettle_577843c5-234f-11eb-b308-d38e88d4b1fdshell
    

    证明 -Djava.io.tmpdir=/opt/code/kettle_tmp 生效了,并且没有再报相同的权限错误。

  • 相关阅读:
    Shell判断文件或目录是否存在
    linux使用wpa_supplicant手动配置wifi
    ubuntu更换apt源后依然搜索旧软件源下载失败问题
    在Ubuntu下解决E: 无法对目录 /var/lib/apt/lists/ 加锁的问题
    Bash中判断一个命令的输出结果是否为空
    [解决]/bin/bash^M: bad interpreter: No such file or directory
    【转】 使用 NetworkManager 命令行工具 nmcli
    【转】wpa_supplicant及wpa_cli使用方法
    [RK3288] Vendor Storage区域知识及探讨
    安装oracle 时“[INS-30014]无法检查指定的位置是否位于 CFS上”问题
  • 原文地址:https://www.cnblogs.com/asimov/p/13956085.html
Copyright © 2011-2022 走看看