假设我有一个存储在c:\my directory\my file.exe
中的可执行文件,我希望在我的R脚本开头附近启动,然后在我的R脚本结束附近终止。什么是干净的方式在Windows平台上做到这一点?
我知道像shell
和shell.exec
这样的R命令,但我不清楚这些命令是否允许干净地捕获进程ID,然后使用the pskill function之类的东西。还不清楚通过某种pipe conection运行这个可执行文件是否更有意义 - 或者该管道是如何工作的。这个特定的可执行文件应作为系统变量包含在我的windows PATH
中,因此可以想象system
函数在这里也可能有价值。
进一步澄清:捕获进程ID可能很重要,因为(至少对我而言)这将用于数据库服务器的可执行文件 - 如果多个数据库服务器当前在同一台机器上运行,则该进程不应该杀死所有这些 - 只是在R脚本开始时初始化的那个。
获得额外信用:假设应该通过实际执行另一个文件c:\my directory\my file.exe
来调用c:\my directory\another file.bat
- 但是需要在R脚本结尾处杀死它my file.exe
。 / p>
答案 0 :(得分:4)
根据收到的其他两个答案,这种技术似乎是实现既定目标的合理方式。
# 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 )
答案 1 :(得分:2)
您可以使用system
功能:
system("Taskkill /IM myfile.exe /F")
编辑:这在我的计算机上使用Windows 7(通过杀死skype.exe进行测试)。
答案 2 :(得分:2)
过去,我使用psKill。它真的很强大,也许很危险。你甚至在远程计算机上杀死了多个程序。我想你知道,当我们想杀死残酷的过程时,我们必须非常小心。
然后你使用像这样的东西
process_name <- 'your_process_name'
system(paste(path_to_pskil,'pskill ',process_name,sep=''),intern=T)
例如,要杀死所有chrome实例,请执行此操作
system('c:/temp/pskill chrome',intern=T) !!
修改强>
假设您有多个具有相同名称的进程。您可以使用pslist
列出具有此名称的所有进程。根据已用时间查找要杀死的进程的ID,然后按id调用pskill。
例如,我想要杀死,最后一次启动 chrome 进程
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)