0
votes

I am trying to execute perl script from tcl using bsub command. It executed the first command but after that it did not print the puts value neither it executes the other commands.

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/STATUS \
   '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit \
   $c $T $E $review $Error $Reset $Analysis_Error \
   $DFTDSM_Analysis_Error $LP_Analysis_Error']

puts "error entered"

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/STATUS \
   '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit \
   $c $T $W $Lint_Review_warning $Lint_Must_warning $Lint_Reset_warning \ 
   $DFT_Analysis_warning $DFTDSM_Analysis_warning $LP_Analysis_warning']

eval [exec bsub -Ip -R "type=SPARC" -cwd /usr2/SsATUS \
   '/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit \
   $chip $TOP $runtime $run_time_lint_Review $run_time_lint_must \
   $run_time_Lint_Reset $run_time_DFT_Analysis $run_time_DFTDSM_Analysis \
   $run_time_LP_Analysis']
1

1 Answers

2
votes

I assume that the code above is Tcl. I see a few issues here:

  1. Why the eval? Does it output Tcl code that you want to execute?
  2. Do you really want the following arguments:

    bsub
    -Ip
    -R
    type=SPARC
    -cwd
    /usr2/STATUS
    '/usr2/j/local/bin/perl5.6.1
    /usr2/j/CAM_STATUS/auto_submit
    $c
    $T
    $E
    $review
    $Error
    $Reset
    $Analysis_Error
    $DFTDSM_Analysis_Error
    $LP_Analysis_Error'
    

    I think you want exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit $c $T $E $review $Error $Reset $Analysis_Error $DFTDSM_Analysis_Error $LP_Analysis_Error"

    Use " for grouping if you want variable substitution, otherwise {} (Note that Tcl uses it's own variables for this, if you want the environment variables, use $ENV(FOO)

  3. You get the stdout as result from exec when the child process has finished. If there is an error (something was written to stderr or return code != 0) then an error is thrown. Use a surrounding catch if this is the case. If you simply want to print it to std*, you could either redirect std* from the child process to your std* channels with the following "arguments": >@stdout 2>@stderr

So I believe your code should look more or less like this (depending on what you want to archive):

exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_submit $c $T $E $review $Error $Reset $Analysis_Error $DFTDSM_Analysis_Error $LP_Analysis_Error" >@stdout 2>@stderr
puts "error entered"
exec bsub -Ip -R type=SPARC -cwd /usr2/STATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit $c $T $W $Lint_Review_warning $Lint_Must_warning $Lint_Reset_warning $DFT_Analysis_warning $DFTDSM_Analysis_warning $LP_Analysis_warning" >@stdout 2>@stderr
exec bsub -Ip -R type=SPARC -cwd /usr2/SsATUS "/usr2/j/local/bin/perl5.6.1 /usr2/j/CAM_STATUS/auto_pldrc_submit $chip $TOP $runtime $run_time_lint_Review $run_time_lint_must $run_time_Lint_Reset $run_time_DFT_Analysis $run_time_DFTDSM_Analysis $run_time_LP_Analysis" >@stdout 2>@stderr