【问题标题】:How do I check if a command used for pipe() failed?如何检查用于 pipe() 的命令是否失败?
【发布时间】:2019-06-06 12:00:27
【问题描述】:

比方说,我写了一个形式的压缩函数:

compress <- function(text, file){
    c <- paste0("gzip -c > ",shQuote(file))
    p <- pipe(c, open = "wb")
    on.exit(close(p))
    writeLines(text, p)
}

现在我可以像这样压缩字符串了:

compress("Hello World", "test.gz")
system("zcat test.gz")
## Hello World

但是,如何检查gzip 调用的程序pipe() 是否成功?

例如

compress("Hello World", "nonexistent-dir/test.gz")
## sh: nonexistent-dir/test.gz: No such file or directory

导致在 STDERR 上打印错误消息,但我无法创建 R 错误。程序继续运行而不保存我的文本。

我知道我可以在这个例子中检查目标文件是否存在。但是有很多可能的错误,比如磁盘空间结束、找不到程序、缺少某些库、找到程序but the ELF interpreter was not 等等。我只是想不出任何方法来测试所有可能的错误。

我搜索了帮助页面?pipe,但没有找到任何提示。

作为一种特定于 UNIX 的方法,我尝试捕获 SIGPIPE 信号,但找不到执行此操作的方法。到目前为止,有关此主题的 Stack Overflow 问题仍未得到解答 [1] [2]

如何检查以pipe() 调用的程序的退出代码或提前终止?

【问题讨论】:

    标签: r io pipe signals


    【解决方案1】:

    我还没有找到使用pipe() 的解决方案,但是包processx 有解决方案。我首先将外部进程创建为后台进程,获取到它的连接并写入该连接。

    在开始编写之前,我会检查进程是否正在运行。写完之后可以查看程序的退出代码了。

    library(processx)
    p <- process$new("pigz","-c",stdin="|", stdout = "/tmp/test.gz")
    if(!p$is_alive()) stop("Subprocess ended prematurely")
    con <- p$get_input_connection()
    # Write output
    conn_write(con, "Hello World")
    close(con)
    p$wait()
    if(p$get_exit_status() != 0) stop("Subprocess failed")
    system("zcat /tmp/test.gz")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-02
      • 2011-09-07
      • 2016-09-17
      • 2016-10-20
      相关资源
      最近更新 更多