[英]Run command with `system2(..., wait = FALSE)` in R and kill it later
假设我想从 R 启动一个本地服务器,访问它几次进行计算并在最后再次杀死它。 所以:
## start the server
system2("sleep", "100", wait = FALSE)
## do some work
# Here I want to kill the process started at the beginning
这应该是跨平台的,因为它是 package(Mac,Linux,Windows,...)的一部分。
如何在 R 中实现这一点?
我必须运行的命令是 java jar,
system2("java", "... plantuml.jar ...")
使用进程 x processx
。
proc <- processx::process$new("sleep", c("100"))
proc
# PROCESS 'sleep', running, pid 431792.
### ... pause ...
proc
# PROCESS 'sleep', running, pid 431792.
proc$kill()
# [1] TRUE
proc
# PROCESS 'sleep', finished.
proc$get_exit_status()
# [1] 2
finished
的 output 只是表示进程已经退出,而不是成功还是出错。 使用退出状态,其中0
表示良好的退出。
proc <- processx::process$new("sleep", c("1"))
Sys.sleep(1)
proc
# PROCESS 'sleep', finished.
proc$get_exit_status()
# [1] 0
仅供参考,当您不需要轻易杀死它并且在命令或其 arguments 中没有任何嵌入式空格时,base R 的system
和system2
工作正常。 system2
看起来应该在嵌入式空间上更好(因为它接受参数向量),但在引擎盖下它所做的只是
command <- paste(c(shQuote(command), env, args), collapse = " ")
接着
rval <- .Internal(system(command, flag, f, stdout, stderr, timeout))
这对保护 arguments 没有任何作用。
您说“做一些工作”,这表明您需要定期向/从它传递一些东西。 processx
确实支持写入后台进程的标准输入,以及捕获其 output。 它在https://processx.r-lib.org/的文档中有很多很好的例子,包括对 output 的一次性调用或回调 ZC1C425268E68385D1AB5074C17A94F14。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.