Terminate one or more cluster nodes using process signaling

killNode(x, signal = tools::SIGTERM, ...)

## Arguments

x

cluster or cluster node to terminate.

signal

An integer that specifies the signal level to be sent to the parallel R process. It's only tools::SIGINT (2) and tools::SIGTERM (15) that are supported on all operating systems (i.e. Unix, macOS, and MS Windows). All other signals are platform specific, cf. tools::pskill().

...

Not used.

## Value

TRUE if the signal was successfully applied, FALSE if not, and NA if signaling is not supported on the specific cluster or node. Warning: With R (< 3.5.0), NA is always returned. This is due to a bug in R (< 3.5.0), where the signaling result cannot be trusted.

## Details

Note that the preferred way to terminate a cluster is via parallel::stopCluster(), because it terminates the cluster nodes by kindly asking each of them to nicely shut themselves down. Using killNode() is a much more sever approach. It abruptly terminates the underlying R process, possibly without giving the parallel worker a chance to terminate gracefully. For example, it might get terminated in the middle of writing to file.

tools::pskill() is used to send the signal to the R process hosting the parallel worker.

## Known limitations

This function works only with cluster nodes of class RichSOCKnode, which were created by makeClusterPSOCK(). It does not work when using parallel::makeCluster() and friends.

Currently, it's only possible to send signals to parallel workers, that is, cluster nodes, that run on the local machine. If attempted to use killNode() on a remote parallel workers, NA is returned and an informative warning is produced.

Use isNodeAlive() to check whether one or mode cluster nodes are alive.

## Examples

if (.Platform\$OS.type != "windows" || interactive()) {
cl <- makeClusterPSOCK(2)
print(isNodeAlive(cl))  ## [1] TRUE TRUE

res <- killNode(cl)
print(res)

## It might take a moment before the background
## workers are shutdown after having been signaled
Sys.sleep(1.0)

print(isNodeAlive(cl))  ## [1] FALSE FALSE
}
#> [1] TRUE TRUE
#> [1] TRUE TRUE
#> [1] FALSE FALSE