csh-script to run a job after an existing job terminates

Peter S. Shenkin peters at cubsvax.UUCP
Tue Jul 22 07:59:37 AEST 1986


DESCRIPTION:
after:	a procedure that waits until a particular running process terminates, 
	then initiates a new process.  This runs under csh, but should be
	easily translatable to bsh or ksh.

USAGE:
after pid shellscript [seconds]

"pid" is the pid number of a running job.
"shellscript" is the name of an executable file which contains commands to be 
	executed once the process number "pid" has terminated.
"seconds" is an optional integer which specifies how often "after" will test for
	termination of process number "pid".  If not specified, 900 seconds 
	(i.e., every 15 minutes) is the default.

MOTIVATION:
	I often run very long, cpu-intensive jobs on our VAX 11/780, which runs
ULTRIX.  If I have two of these jobs running simultaneously, they generally take
considerably longer to complete than if they run sequentially, even if I'm
the only one on the machine.  In addition, if they run sequentially, I get to 
see the results of the first long before the second terminates.  If I know in 
advance I'm going to run two in a row, I can execute a script that runs them in 
order, or else enter the two jobs on a line separated by a semi-colon.  
Sometimes, however, I don't decide to run job2 until job1 has already started;
also, setting up such a job sometimes takes a good deal of preparation, and
I'd like to start job1, then turn my attention to preparing the input for job2,
then tell job2 to start after job1 finishes, then go home.

INSTALLATION:
	Install the first file, "after", in your ~/bin, and the second file,
"awkfinafter", in your ~/etc.  If you don't like these directories, pick ones
you do; if you change the directory for awkfinafter, you'll have to change
the assignment of awkfin in "after" to correspond.

PHILOSOPHICAL RUMINATIONS:
	This script seems too simple to post, yet too useful not to.
	The way it works is to create an awk program file using sed to insert
the process id supplied to after.  Then the output of ps is awk-ed, and if the
process id is not found, the shellscript given to after is executed.  If it is
found, after "sleep"s for the time interval given (or for a default time of
15 minutes) before trying again.  (It might sound simpler to search the output
of ps using "fgrep pid", but ps will return a line for the fgrep job, so the 
search will always succeed!)
	Note that "after" will not terminate until the script it runs
terminates;  that means that if you've used "after" to queue up job2 to run 
after job1 terminates, you can use the pid of that "after" to run a second 
"after" which queues up job3, and rest assured that job3 will not commence until
job2 terminates.  And so on ad infinitum (or at least ad nauseum).
	Enjoy!  If you like it a lot or think it's dumb or something drop me a
line.

Peter S. Shenkin	 Columbia Univ. Biology Dept., NY, NY  10027
{philabs,rna}!cubsvax!peters		cubsvax!peters at columbia.ARPA

----------------------file $home/bin/after begins here--------------------------
#
# "after". 21jul86. runs a shell script after a running process has finished
# Peter S. Shenkin	 Columbia Univ. Biology Dept., NY, NY  10027
# {philabs,rna}!cubsvax!peters		cubsvax!peters at columbia.ARPA

# parse command line, and set sleep interval if not specified
if( $#argv == 3 ) then
	set seconds=$3
else if( $#argv == 2 ) then
	set seconds=900
else
	echo 'usage: after pid shellscript [seconds, default=900 ]'
	exit
endif

# initialize internal variables
set awkfin=$home/etc/awkfinafter
set awkfout=/tmp/after$$

# create awk program file
sed -e s/@@/$1/ $awkfin> $awkfout

# take a breather for $seconds;  check for pid;
#   when no longer found, run script ($2), cleanup and exit
while 1
	sleep $seconds
	if( 0 == `ps | awk -f $awkfout` ) then
		$2
		/bin/rm $awkfout
		exit
	endif
end
----------------------file $home/bin/after ends here--------------------------
----------------------file $home/etc/awkfinafter starts here------------------
BEGIN		{ found = 0 }
$1 == @@	{ found = 1; exit }
END		{ print found }
----------------------file $home/etc/awkfinafter ends here------------------



More information about the Comp.sources.unix mailing list