【问题标题】:my jython procedure coudn't detect errors of my shell script我的 jython 程序无法检测到我的 shell 脚本的错误
【发布时间】:2015-11-17 11:18:57
【问题描述】:

我成功创建了一个包含文件的脚本,并且我成功地通过 jython 过程调用了这个脚本,

这是我的 Jython 进程:

import os    

cmd = "<%=odiRef.getSchemaName("script_path","D")%>/split_ncl.sh <%=snpRef.getSchemaName("data_in","D")%>/<%=odiRef.getOption("REP_FILE")%> <%=snpRef.getOption("FILENAME")%>"  

retcode = os.system(cmd)  
if retcode > 1 :      
    raise "Fatal ListError (%d)" % retcode, "Erreur de split"

这是我的脚本 shell split_ncl.sh:

exec > Log/errors.log                                                                      
exec 2>&1

data_in=$1
fichier=$2

cd $data_in

#Purge des fichiers 

rm -f Split/INIT_ENC.dat
rm -f Split/INIT_ELP.dat


grep -P "^..........ENC" fichier ><!> Split/INIT_ENC.dat
grep -P "^..........ELP" $fichier >> Split/INIT_ELP.dat

一切正常。我添加exec &gt; Log/errors.logexec 2&gt;&amp;1 将我脚本的所有错误重定向到errors.log

当我在 UNIX 环境中执行脚本时,它运行良好,它可能会记录错误,但是当我使用 ODI 并像我所做的那样通过 Jython 过程调用此脚本时,它无法检测到我的 shell 脚本的错误,例如,如果我输入fichier 而不是$fichier(缺少$),这是不正确的并且它无法检测到错误。我该如何解决这个问题!

【问题讨论】:

    标签: linux bash shell jython oracle-data-integrator


    【解决方案1】:

    你应该使用 Python 的 subprocess 库而不是 os。

    os.system() 发送命令,并返回成功消息。假设它是异步的,它不等待进程完成。它只会触发进程。

    subprocess.call()发送命令,等待进程完成返回进程返回码。

    因此,如果您将代码更改为:

    retcode = subprocess.call(cmd) 
    if retcode > 1 :     
    raise "Fatal ListError (%d)" % retcode, "Erreur de split"
    

    还有一件事,如果您尝试捕获错误,请将您的条件语句更改为 retcode != 0,因为错误的进程可以返回 0 以外的任何值。

    更多信息:https://docs.python.org/2/library/subprocess.html#replacing-os-system

    【讨论】:

      猜你喜欢
      • 2020-05-27
      • 2022-01-14
      • 2016-04-04
      • 2010-12-23
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-04
      相关资源
      最近更新 更多