【问题标题】:How to get an Rscript to return a status code in non-interactive bash mode如何让 Rscript 在非交互式 bash 模式下返回状态码
【发布时间】:2019-10-28 13:46:24
【问题描述】:

我正在尝试从以 bash 脚本形式以非交互方式运行的 Rscript 中获取状态代码。此步骤是较大数据处理周期的一部分,其中涉及 db2 脚本。

所以我在脚本 sample.sh 中有以下内容:

Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout

运行此 sample.sh 时,无论 sample.r 脚本是完全运行还是在中间步骤中出错,它总是返回状态代码 0。

我尝试了以下方法,但没有成功

1 - 在 sample.sh 文件中,我为返回代码添加了一个 if 和 else 条件,如下所示,但它再次写回 0,尽管 sample.r 在其中的一个函数中失败。

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r >> sample.rout
then
  echo -e "0"
else
  echo -e "1"
fi

2 - 我还尝试了一个包装脚本,例如在 sample.wrapper.sh 文件中

r=0
a=$(./sample.sh)
r=$?

echo -e "\n return code of the script is: $a\n"
echo -e  "\n The process completed with status: $r"

在这里,如果 sample.r 在变量 ar 的中间步骤中失败,我也没有得到预期的“1”。理想情况下,我想要一种方法来捕获a 中的错误(如“1”)。

有人可以建议如何让 rscript 仅在整个脚本完成且没有任何错误的情况下写入“0”,而在所有其他情况下写入“1”?

非常感谢您的意见!谢谢!

【问题讨论】:

  • 你的 Rscript 是什么样的?如果我在具有未知函数/不正确语法的文件上运行 Rscript,我会看到预期的退出代码 1
  • @jenesaisquoi 我的 Rscript 是一个涉及从 db2 数据库获取数据、进行计算以及将数据写回 db2 数据库等的过程。我的问题是,如果该过程在任何步骤中失败,R 将错误写回控制台并在那里结束。但它写入的返回码仍然是“0”。但如果过程中出现任何错误,我希望返回代码为“1”。
  • @StewartMacdonald 我之前已经检查过这篇文章,我不知道如何让它适用于我的用例。

标签: r bash batch-processing rscript non-interactive


【解决方案1】:

我通过返回除了 echo 之外的状态码解决了这个问题。下面是从 sample.sh 脚本中截取的代码。此外,在 sample.R 代码中,我添加了 trycatch 来捕获错误并退出(状态 = 1)。

function fun {

if Rscript --verbose --no-restore --no-save /home/R/scripts/sample.r > sample.rout 2>&1
then
  echo -e "0"
  return 0  
else
  echo -e "1"
  return 1
fi

}

fun

感谢大家的投入。

【讨论】:

    【解决方案2】:

    上面的代码对我有用。我对其进行了修改,以便我可以重用该函数并在出现错误时让它退出

    Rscript_with_status () {
    
    rscript=$1
    
    if Rscript --vanilla $rscript
    then
            return 0
    else
            exit 1
    fi
    
    }
    

    运行 r 脚本:

    Rscript_with_status /path/to/script/sample.r
    

    【讨论】:

      【解决方案3】:

      您的远程脚本需要提供正确的退出状态。 您可以通过在远程脚本末尾提供即“exit 1”来进行第一次测试,看看它会有所作为。

      remote.sh:

      #!/bin/sh
      exit 1
      

      从本地机器:

      ssh -l username remoteip /home/username/remote.sh
      echo $?
      1
      

      但是远程脚本还应该向您提供最后执行的命令的退出状态。通过修改远程脚本进一步试验:

      #!/bin/sh
      #exit 1
      /bin/false
      

      远程命令的退出状态现在也将是 1。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2022-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多