我的问题特定于SPECCPU2006(基准套件)的运行。 安装基准测试后,我可以在终端中调用一个名为“specinvoke”的命令来运行特定的基准测试。我有另一个脚本,其中部分代码如下:
cd (specific benchmark directory)
specinvoke &
pid=$!
我的目标是获取正在运行的任务的PID。但是,通过执行上面显示的操作,我得到的是“specinvoke”shell命令的PID,而实际运行的任务将有另一个PID。
但是,通过运行specinvoke -n
,specinvoke shell中运行的实际代码将输出到stdout。例如,对于一个基准测试,它是这样的:
# 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
并运行转储的材料?
答案 0 :(得分: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
答案 1 :(得分: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)