How to run an executable and then kill or end the same process using R in Windows

let's say I have an executable file stored in c:\my directory\my file.exe that I would like to initiate near the beginning of my R script, and then end near the end of my R script. what clean ways do this on windows platform?

I know the R commands, such as shell and shell.exec , but it is not clear to me that they will clear the capture of the process identifier, and then use something like the pskill function . it is also unclear whether it makes sense to run this executable file through some kind of pipe pipeline - or how this pipe will work. this particular executable should be included in my PATH windows as a system variable, so we can assume that the system function may also matter.

further clarification: capturing a process identifier can be important because (at least for me) it will be used on an executable database server server - if there are currently several database servers running on the same computer, this process should not kill all of them - only one initialized at the beginning of the R script.

for extra credit: let c:\my directory\my file.exe be called by actually executing another file - c:\my directory\another file.bat - but it is my file.exe , which should be killed at the end of the R script .

+4
source share
3 answers

Building on the other two responses received, this method seems like a reasonable way to achieve the stated goal.

 # specify executable file exe.file <- "C:\\Users\\AnthonyD\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe" # capture the result of a `tasklist` system call before.win.tasklist <- system2( 'tasklist' , stdout = TRUE ) # store all pids before running the process before.pids <- substr( before.win.tasklist[ -(1:3) ] , 27 , 35 ) # run the process shell.exec( exe.file ) # capture the result of a `tasklist` system call after.win.tasklist <- system2( 'tasklist' , stdout = TRUE ) # store all tasks after running the process after.tasks <- substr( after.win.tasklist[ -(1:3) ] , 1 , 25 ) # store all pids after running the process after.pids <- substr( after.win.tasklist[ -(1:3) ] , 27 , 35 ) # store the number in the task list containing the PIDs you've just initiated initiated.pid.positions <- which( !( after.pids %in% before.pids ) ) # remove whitespace after.tasks <- gsub( " " , "" , after.tasks ) # find the pid position that matches the executable file name correct.pid.position <- intersect( which( after.tasks %in% basename( exe.file ) ) , initiated.pid.positions ) # remove whitespace correct.pid <- gsub( " " , "" , after.pids[ correct.pid.position ] ) # write the taskkill command line taskkill.cmd <- paste( "taskkill" , "/PID" , correct.pid ) # wait thirty seconds (so the program fully loads) Sys.sleep( 30 ) # kill the same process that was loaded system( taskkill.cmd ) 
+2
source

You can use the system function:

 system("Taskkill /IM myfile.exe /F") 

edit: This worked on my Windows 7 computer (tested with killing skype.exe).

+2
source

In the past, I used psKill . It is really powerful and possibly dangerous. You kill multiprocesses even on a remote computer. I think you know that we must be very careful when we want to kill a cruel process.

  • Download the tool, unzip and copy along the known path.
  • The first time you start, you request liscence. You run it from cmd once, and you agree.

Then you use something like this

 process_name <- 'your_process_name' system(paste(path_to_pskil,'pskill ',process_name,sep=''),intern=T) 

For example, to kill all instances of chrome, you do this

 system('c:/temp/pskill chrome',intern=T) !! 

EDIT

Assuming you have multiple processes with the same name. You can use pslist to list the entire process with this name. Find the identifier of the process you want to kill, according to its elapsed time, then call pskill by id.

For example, here I want to kill, the last running chrome process

 my.process <- system('c:/temp/pslist chrome ',intern=T)[-c(1:8)] my.process [1] "chrome 3852 8 38 1052 141008 0:01:58.108 1:43:11.547" [2] "chrome 5428 8 11 202 220392 0:02:08.092 1:43:11.359" [3] "chrome 6228 8 9 146 73692 0:01:58.467 1:43:00.091" [4] "chrome 6312 6 9 130 45420 0:00:08.704 1:17:30.153" [5] "chrome 360 6 9 127 29252 0:00:01.263 0:57:01.084" [6] "chrome 5032 6 9 126 29596 0:00:00.717 0:31:39.875" [7] "chrome 2572 8 9 120 23816 0:00:00.452 0:19:10.307" ## ids are orderd according to the elpased time ## I use tail to get the last one ## some regular expression to get the id from the string ## mine is ugly but I am sure you can do better. id <- substr(gsub("([^[:digit:]]*)", "", tail(my.process,1)),1,4) system(paste('c:/temp/pskill ', id) ,intern=T) 
+2
source

All Articles