7

假设我存储了一个可执行文件c:\my directory\my file.exe,我想在我的 R 脚本开头附近启动,然后在我的 R 脚本结尾附近终止。在 Windows 平台上执行此操作有哪些干净的方法?

我知道像shelland这样的 R 命令shell.exec,但我不清楚这些命令是否允许干净地捕获进程 ID,然后使用类似pskill 函数的东西。也不清楚通过某种管道连接运行这个可执行文件是否更有意义- 或者该管道将如何工作。这个特定的可执行文件应该PATH作为系统变量包含在我的窗口中,因此可以想象该system函数在这里也可能有价值。

附加说明:捕获进程 id 可能很重要,因为(至少对我而言)这将用于数据库服务器的可执行文件——如果多个数据库服务器当前在同一台机器上运行,则该进程不应杀死所有这些服务器- 只是在 R 脚本开始时初始化的那个。

额外的功劳:假设c:\my directory\my file.exe应该通过实际执行另一个文件来调用c:\my directory\another file.bat- 但它my file.exe需要在 R 脚本的末尾被杀死。

4

3 回答 3

5

根据收到的其他两个答案,这种技术似乎是实现既定目标的合理方法。

# 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 )
于 2013-02-28T18:00:41.830 回答
2

你可以使用system功能:

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

编辑:这在我的 Windows 7 计算机上工作(通过杀死 skype.exe 进行测试)。

于 2013-02-28T13:05:09.230 回答
2

过去,我使用psKill。它真的很强大,也许很危险。即使在远程计算机中,您也会杀死多进程。我想你知道当我们想要残忍地杀死进程时,我们必须非常小心。

  1. 下载工具,解压并复制到已知路径。
  2. 第一次启动时要求许可。您从 cmd 启动一次并同意。

然后你用这样的东西

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)
于 2013-02-28T15:26:23.867 回答