2

我的问题是特定于 SPECCPU2006(基准套件)的运行。安装基准测试后,我可以在终端中调用一个名为“specinvoke”的命令来运行特定的基准测试。我有另一个脚本,其中部分代码如下:

cd (specific benchmark directory)
specinvoke &
pid=$! 

我的目标是获取正在运行的任务的 PID。但是,通过执行上面显示的操作,我得到的是“specinvoke”shell 命令的 PID,而真正运行的任务将有另一个 PID。

但是,通过运行specinvoke -n,在 specinvoke shell 中运行的真实代码将输出到标准输出。例如,对于一个基准,它是这样的:

# specinvoke r6392
#  Invoked as: specinvoke -n
# timer ticks over every 1000 ns
# Use another -n on the command line to see chdir commands and env dump
# Starting run for copy #0
../run_base_ref_gcc43-64bit.0000/milc_base.gcc43-64bit < su3imp.in > su3imp.out 2>> su3imp.err

它在里面运行一个二进制文件。代码将因基准测试而异(通过在不同的基准测试目录下调用)。而且因为安装了“specinvoke”而不仅仅是一个脚本,所以我不能使用“ source specinvoke”。

那么有什么线索吗?有什么方法可以直接在同一个 shell 中调用 shell 命令(具有相同的 PID),或者我应该转储specinvoke -n并运行转储的材料?

4

2 回答 2

1

您仍然可以执行以下操作:

cd (specific benchmark directory)
specinvoke &
pid=$(pgrep milc_base.gcc43-64bit)

如果有多次调用 milc_base.gcc43-64bit binary,您仍然可以使用

pid=$(pgrep -n milc_base.gcc43-64bit)

根据手册页:

-n

Select only the newest (most recently started) of the matching
processes
于 2013-07-06T20:24:49.900 回答
0

当进程是子shell的直接子进程时:

ps -o pid= -C=milc_base.gcc43-64bit --ppid $!

如果不是直接孩子,您可以从 pstree 获取信息:

pstree -p $! | grep -o 'milc_base.gcc43-64bit(.*)'

上面的输出(PID 在括号中):milc_base.gcc43-64bit(9837)

于 2018-11-23T01:07:25.053 回答