簡體   English   中英

如何檢查用於pipe()的命令是否失敗?

[英]How do I check if a command used for pipe() failed?

說,我已經編寫了以下形式的壓縮函數:

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

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

例如

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

導致在STDERR上打印錯誤消息,但是我無法創建R錯誤。 該程序只是繼續而不保存我的文本。

我知道在這個例子中我可以檢查目標文件是否存在。 但是有很多可能的錯誤,例如磁盤空間不足,找不到程序,缺少某些庫,找到了程序但沒有ELF解釋器等。我只是想不出任何方法來測試所有可能的方法錯誤。

我搜索了幫助頁面?pipe ,但找不到任何提示。

作為特定於UNIX的方法,我嘗試捕獲SIGPIPE信號,但是找不到解決方法。 到目前為止,有關此主題的堆棧溢出問題仍未得到解答[1] [2]

如何檢查使用pipe()調用的程序的退出代碼或過早終止?

我沒有找到使用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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM