<br><br><div class="gmail_quote">On Wed, Jul 2, 2008 at 2:07 PM, Corey Ferrier &lt;<a href="mailto:coreyf@clemson.edu">coreyf@clemson.edu</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">On Wed, Jul 02, 2008 at 10:39:23AM -0700, David Sheen wrote:<br>
&gt;The parallel programming environments we use (e.g. MPICH) use SSH to<br>
&gt;create processes on the sister nodes. &nbsp;If these jobs fail (are<br>
&gt;deleted, the mother node crashes, etc), the spawned processes remain<br>
&gt;on the sisters and eventually someone has to go and clean them out.<br>
&gt;Is there any way to use epilogue scripts to keep track of these<br>
&gt;processes and make sure they get killed properly if they need to be?<br>
&gt;<br>
<br>
</div>Because we do not place execution limits on nodes<br>
(users can have multiple jobs running on the same node<br>
and multiple users can be using the same node),<br>
we use an epilogue script which calls another script<br>
to clean up leftover processes based on the jobid.<br>
<br>
Here is the epilogue script, which runs on the mother superior node<br>
and executes as root.<br>
<br>
 &nbsp; #!/bin/bash<br>
 &nbsp; JOBID=$1<br>
 &nbsp; JOBUSER=$2<br>
<br>
 &nbsp; # get nodes involved in this job<br>
 &nbsp; nodelist=/var/spool/torque/aux/$JOBID<br>
 &nbsp; if [ -r $nodelist ] ; then<br>
 &nbsp; &nbsp; nodes=$(sort $nodelist | uniq)<br>
 &nbsp; else<br>
 &nbsp; &nbsp; nodes=localhost<br>
 &nbsp; fi<br>
<br>
 &nbsp; # for each node involved in the job<br>
 &nbsp; # kill any pids leftover from that job<br>
<br>
 &nbsp; for i in $nodes ; do<br>
 &nbsp; &nbsp; ssh $i &quot;su -c &#39;/var/spool/torque/mom_priv/cleanup $JOBID&#39; $JOBUSER&quot;<br>
 &nbsp; done<br>
<br>
<br>
Here is the &#39;cleanup&#39; script:<br>
<br>
 &nbsp; #!/bin/bash<br>
<br>
 &nbsp; # look in the /proc process structure and<br>
 &nbsp; # kill all pids associated with the passed in $JOBID<br>
 &nbsp; # this script is run as the user, not root<br>
<br>
 &nbsp; TOKILL=$1<br>
 &nbsp; [ -z &quot;${TOKILL}&quot; ] &amp;&amp; exit 1<br>
 &nbsp; ME=`whoami`<br>
 &nbsp; cd /<br>
 &nbsp; find /proc -noleaf -maxdepth 2 -name environ -user $ME |<br>
 &nbsp; while read x; do<br>
 &nbsp; &nbsp; PBS_JOBID=&quot;&quot;<br>
 &nbsp; &nbsp; if [ -e $x ]; then<br>
 &nbsp; &nbsp; &nbsp; pid=$(basename $(dirname $x))<br>
 &nbsp; &nbsp; &nbsp; if [ -e $x ]; then<br>
 &nbsp; &nbsp; &nbsp; &nbsp; eval $(cat $x | tr &#39;\0&#39; &#39;\n&#39; | grep PBS_JOBID)<br>
 &nbsp; &nbsp; &nbsp; &nbsp; if [ &quot;${PBS_JOBID}&quot; == &quot;${TOKILL}&quot; ]; then<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kill -9 $pid<br>
 &nbsp; &nbsp; &nbsp; &nbsp; fi<br>
 &nbsp; &nbsp; &nbsp; fi<br>
 &nbsp; &nbsp; fi<br>
 &nbsp; done<br>
<br>
<br>
- Corey</blockquote></div><br><br>such a script shoud be unnecessary if you use a TM-based job launcher for whatever flavor of MPI you use, but I guess it doesn&#39;t hurt <br>