编写完的 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 生效了,并且没有再报相同的权限错误。

kettle 执行 kjb 临时文件夹 /tmp permission denied 问题的更多相关文章

  1. linux 下执行.sh文件总是提示permission denied

      linux 下执行.sh文件总是提示permission denied 如果你是root登陆的话(不是的话,切换到root用户,对*.sh赋可执行的权限) chmod 777 *.sh or ch ...

  2. 执行docker命令遇到 Get Permission Denied

    安装完docker后,执行docker相关命令,出现: Got permission denied while trying to connect to the Docker daemon socke ...

  3. 执行*.sh脚本时提示Permission denied

    使用chmod修改.sh的权限 chmod u+x *.sh 再次执行

  4. hadoop学习;hdfs操作;执行抛出权限异常: Permission denied;api查看源代码方法;源代码不停的向里循环;抽象类通过debug查找源代码

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u010026901/article/details/26587251 eclipse快捷键alt+s ...

  5. 容器挂载volume出现“Permission denied”的问题定位解决

    使用如下系统(centos)运行容器后,在容器内的挂载目录内执行ls命令出现了“Permission denied”的错误 Linux localhost.localdomain 3.10.0-862 ...

  6. ubunt 文件permission denied问题的解决

    在linux系统使用过程中,升级python到3.6以后,执行pip命令,遇到permission denied问题,系统显示如下: -bash: /home/www/my_flask/venv/bi ...

  7. /tmp目录下执行脚本失败提示Permission denied

    Linux上执行Shell脚本运行失败提示Permission denied一个问题,挺好的问题,切中了知识盲点. 问题现象 Shell脚本在/tmp目录下,执行./test.sh运行失败,提示Per ...

  8. [转帖]Linux /tmp目录下执行脚本失败提示Permission denied

    Linux /tmp目录下执行脚本失败提示Permission denied https://www.cnblogs.com/linyfeng/p/11087655.html 国产化的环境上 就有一个 ...

  9. eclipse 向HDFS中创建文件夹报错 permission denied

    环境:win7  eclipse    hadoop 1.1.2 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSy ...

随机推荐

  1. Roman Numerals All In One

    Roman Numerals All In One 罗马数字 refs https://www.mathsisfun.com/roman-numerals.html https://www.maths ...

  2. 微信小程序批量上传图片 All In One

    微信小程序批量上传图片 All In One open-data https://developers.weixin.qq.com/miniprogram/dev/component/open-dat ...

  3. 如何实现一个 markdown 图片粘贴上传的博客后台系统

    如何实现一个 markdown 图片粘贴上传的博客后台系统 js 实现 drag & drop / copy & paste image uploader MongoDB 设计文档对象 ...

  4. Learning CSS with Chrome DevTools

    Learning CSS with Chrome DevTools CSS 复合属性展开 border background box-shadow flex-flow flex HTML5 custo ...

  5. Vue & mobile UI components

    Vue & mobile UI components https://github.com/vuejs/awesome-vue https://awesome-vue.js.org/ http ...

  6. NGK公链存储技术,如何开创应用落地新格局?

    尽管无人预测未来,但是资本的眼光总是那么灵敏,最近几年,国际资本市场纷纷将目光投到了公链市场上.从TPS高点备受抢占,再到DApp生态的不断涌现,再到目前Staking和Defi的新概念生态的不断发力 ...

  7. AtCoder Beginner Contest 192 F - Potion

    题目链接 点我跳转 题目大意 给定 \(N\) 个物品和一个 \(X\) ,第 \(i\) 个物品的重量为 \(ai\),你可以从中选择任意个物品(不能不选) 假定选择了 \(S\) 个物品,物品的总 ...

  8. scala函数至简原则是什么?

    1.return可以省略,Scala会使用函数体的最后一行代码作为返回值 2.如果函数体只有一行代码,可以省略花括号 3.返回值类型如果能够推断出来,那么可以省略(:和返回值类型一起省略) 4.如果有 ...

  9. ECMAScript 等性运算符

    判断两个变量是否相等是程序设计中非常重要的运算.在处理原始值时,这种运算相当简单,但涉及对象,任务就稍有点复杂. ECMAScript 提供了两套等性运算符:等号和非等号用于处理原始值,全等号和非全等 ...

  10. Python安装教程

    1.下载好Python安装包后,双击打开(第一个是32位,第二个是64位,根据自己电脑位数进行选择): 2.打开后如下,先将下方的Python添加到系统环境变量勾选上,再点击第一个默认安装即可: 3. ...