Hao Shen
Hao Shen

Reputation: 2735

Run a script in the same shell(bash)

My problem is specific to the running of SPECCPU2006(a benchmark suite). After I installed the benchmark, I can invoke a command called "specinvoke" in terminal to run a specific benchmark. I have another script, where part of the codes are like following:

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

My goal is to get the PID of the running task. However, by doing what is shown above, what I got is the PID for the "specinvoke" shell command and the real running task will have another PID.

However, by running specinvoke -n ,the real code running in the specinvoke shell will be output to the stdout. For example, for one benchmark,it's like this:

# 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

Inside it it's running a binary.The code will be different from benchmark to benchmark(by invoking under different benchmark directory). And because "specinvoke" is installed and not just a script, I can not use "source specinvoke".

So is there any clue? Is there any way to directly invoke the shell command in the same shell(have same PID) or maybe I should dump the specinvoke -n and run the dumped materials?

Upvotes: 2

Views: 653

Answers (2)

simohe
simohe

Reputation: 651

when the process is a direct child of the subshell:

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

when not a direct child, you could get the info from pstree:

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

output from above (PID is in brackets): milc_base.gcc43-64bit(9837)

Upvotes: 0

Zsolt Botykai
Zsolt Botykai

Reputation: 51603

You can still do something like:

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

If there are several invocation of the milc_base.gcc43-64bit binary, you can still use

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

Which according to the man page:

-n

Select only the newest (most recently started) of the matching
processes

Upvotes: 1

Related Questions