2013-07-05 25 views
0

我想發出一個信號,一個過程中,我開始在Linux和Mac OS X. systemsystem2然而,通過它們的文檔會我無法找到任何方法來找出新啓動的進程的PID。如何查找R中的system或system2開始的子進程的pid?

+0

什麼是您的操作系統? – Thomas

+0

Linux/Mac OS X – asieira

+0

Unfornate這已被標記爲重複項,因爲與此相同的問題僅涵蓋Windows系統的實際解決方案。我的問題,我結束了自己提供的答案,適用於Linux和Mac OS X. – asieira

回答

1

原來,這並不像我想象的那麼簡單。我正在執行的命令啓動了其他進程,並且我需要殺死的命令進一步進入進程樹。所以即使系統/系統給了我啓動過程的PID,它也不會幫助我。

所以我最後寫這個功能,我在Mac OS X和RedHat Linux上進行測試,以獲取正在運行的進程的data.table:

library(data.table) 
library(stringr) 

# Returns a process list on a Linux or Mac OS X system by calling 'ps' command and 
# parsing its output. 
processList <- function() { 
    # Execute ps 
    ps = robust.system("ps auxww") 
    if (ps$exitStatus != 0) { 
    print(ps) 
    return(NA) 
    } 

    # Turn into data.table 
    ps$stdout = str_trim(ps$stdout) 
    ncols = str_count(ps$stdout[1], "[ ]+") + 1 
    procs = str_split_fixed(ps$stdout, "[ ]+", ncols) 
    ps = as.data.table(procs[2:nrow(procs),]) 
    setnames(ps, 1:ncols, procs[1,]) 
    rm(ncols, procs) 

    # Convert relevant columns to friendlier data types. 
    # Rename Mac OS X style "TT" to "TTY" and "STARTED" to "START" as well. 
    if ("PID" %chin% colnames(ps)) { 
    ps[,PID:=as.integer(as.character(PID))] 
    } 
    if ("%CPU" %chin% colnames(ps)) { 
    setnames(ps, "%CPU", "percentCPU") 
    ps[,percentCPU:=as.numeric(percentCPU)] 
    } 
    if ("%MEM" %chin% colnames(ps)) { 
    setnames(ps, "%MEM", "percentMEM") 
    ps[,percentMEM:=as.numeric(percentMEM)] 
    } 
    if ("TT" %chin% colnames(ps)) { 
    setnames(ps, "TT", "TTY") 
    } 
    if ("STARTED" %chin% colnames(ps)) { 
    setnames(ps, "STARTED", "START") 
    } 
    if ("COMMAND" %chin% colnames(ps)) { 
    ps[,COMMAND:=as.character(COMMAND)] 
    } 

    return(ps) 
} 

請注意,它使用robust.system,所以你我也需要這個。

2

在Windows(也許在其他地方,太):

,你可以分析得到PID爲每個進程
system("tasklist", intern=TRUE) 

收益特徵向量。

可以找到更詳細的答案herehere

+0

任何機會,你能提供這個命令的輸出樣本?對於我在下面發佈的代碼進行改進是非常好的,這樣我也可以在Windows上工作。 – asieira

+0

@asieira我剛剛添加了比我做得更好的答案的鏈接。 – Thomas

相關問題