thiagoveloso
thiagoveloso

Reputation: 2763

How to release R's prompt when using 'system'?

I am writing an R code on a Linux system using RStudio. At some point in the code, I need to use a system call to a command that will download a few thousand of files from the lines of a text file:

down.command <- paste0("parallel --gnu -a links.txt wget")

system(down.command)

However, this command takes a little while to run (a couple of hours), and the R prompt stays locked while the command runs. I would like to keep using R while the command runs on the background.

I tried to use nohup like this:

down.command <- paste0("nohup parallel --gnu -a links.txt wget > ~/down.log 2>&1")

system(down.command)

but the R prompt still gets "locked" waiting for the end of the command.

Is there any way to circumvent this? Is there a way to submit system commands from R and keep them running on the background?

Upvotes: 2

Views: 63

Answers (2)

Konrad Rudolph
Konrad Rudolph

Reputation: 545648

Using ‘processx’, here’s how to create a new process that redirects both stdout and stderr to the same file:

args = c('--gnu', '-a', 'links.txt', 'wget')
p = processx::process$new('parallel', args, stdout = '~/down.log', stderr = '2>&1')

This launches the process and resumes the execution of the R script. You can then interact with the running process via the p name. Notably you can signal to it, you can query its status (e.g. is_alive()), and you can synchronously wait for its completion (optionally with a timeout after which to kill it):

p$wait()
result = p$get_exit_status()

Upvotes: 1

thiagoveloso
thiagoveloso

Reputation: 2763

Based on the comment by @KonradRudolph, I became aware of the processx R package that very smartly deals with system process submissions from within R.

All I had to do was:

library(processx)

down.command <- c("parallel","--gnu", "-a", "links.txt", "wget", ">", "~/down.log", "2>&1")

processx::process$new("nohup", down.comm, cleanup=FALSE)

As simple as that, and very effective.

Upvotes: 1

Related Questions