繁体   English   中英

在 R 中使用 `system2(..., wait = FALSE)` 运行命令并稍后将其杀死

[英]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 中实现这一点?


编辑 1

我必须运行的命令是 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 的systemsystem2工作正常。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM