[英]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.