From tom@@@k@liber@ @ending from gm@il@com  Fri Aug 31 14:51:11 2018
From: tom@@@k@liber@ @ending from gm@il@com (Tomas Kalibera)
Date: Fri, 31 Aug 2018 14:51:11 +0200
Subject: [Rd] Detecting whether a process exists or not by its PID?
In-Reply-To: <CAFDcVCS85ZWsfOwEn4-3Sev+eykSjkeNwxWq_h1ie+_dkt0B5g@mail.gmail.com>
References: <CAFDcVCS85ZWsfOwEn4-3Sev+eykSjkeNwxWq_h1ie+_dkt0B5g@mail.gmail.com>
Message-ID: <1ef168ae-9889-de7e-15f2-631f755fa4aa@gmail.com>

On 08/31/2018 01:18 AM, Henrik Bengtsson wrote:
> Hi, I'd like to test whether a (localhost) PSOCK cluster node is still
> running or not by its PID, e.g. it may have crashed / core dumped.
> I'm ok with getting false-positive results due to *another* process
> with the same PID has since started.
kill(sig=0) is specified by POSIX but indeed as you say there is a race 
condition due to PID-reuse.? In principle, detecting that a worker 
process is still alive cannot be done correctly outside base R. At 
user-level I would probably consider some watchdog, e.g. the parallel 
tasks would be repeatedly touching a file.

In base R, one can do this correctly for forked processes via 
mcparallel/mccollect, not for PSOCK cluster workers which are based on 
system() (and I understand it would be a useful feature)

 > j <- mcparallel(Sys.sleep(1000))
 > mccollect(j, wait=FALSE)
NULL

# kill the child process

 > mccollect(j, wait=FALSE)
$`1542`
NULL

More details indeed in ?mcparallel. The key part is that the job must be 
started as non-detached and as soon as mccollect() collects is, 
mccollect() must never be called on it again.

Tomas

>
> I can the PID of each cluster nodes by querying them for their
> Sys.getpid(), e.g.
>
>      pids <- parallel::clusterEvalQ(cl, Sys.getpid())
>
> Is there a function in core R for testing whether a process with a
> given PID exists or not? From trial'n'error, I found that on Linux:
>
>    pid_exists <- function(pid) as.logical(tools::pskill(pid, signal = 0L))
>
> returns TRUE for existing processes and FALSE otherwise, but I'm not
> sure if I can trust this.  It's not a documented feature in
> ?tools::pskill, which also warns about 'signal' not being standardized
> across OSes.
>
> The other Linux alternative I can imagine is:
>
>    pid_exists <- function(pid) system2("ps", args = c("--pid", pid),
> stdout = FALSE) == 0L
>
> Can I expect this to work on macOS as well?  What about other *nix systems?
>
> And, finally, what can be done on Windows?
>
> I'm sure there are packages on CRAN that provides this, but I'd like
> to keep dependencies at a minimum.
>
> I appreciate any feedback. Thxs,
>
> Henrik
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel



[Rd] Detecting whether a process exists or not by its PID?
Tomas Kalibera