我想向我在 Linux 和 Mac OS X 上启动的进程发送信号system
。system2
但是,通过他们的文档,我无法找到任何方法来找出新启动进程的 pid。
问问题
837 次
2 回答
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,所以你也需要它。
于 2013-07-05T17:48:35.530 回答