Template Submit Scripts
In order to submit a job using the templates, you need both
a submit script and render script.
Both can be created quickly from scratch using the stock templates.
A template submit script can be created quickly via:
rush -tss > submit-script
Here's a template submit script written in CSH:
Csh Template Script
|
#!/bin/csh -f
#
# S U B M I T
#
source $RUSH_DIR/etc/.submit
rush -submit << EOF
title SHOW/SHOT
ram 250
frames 1-100
logdir $cwd/logs # "-" to disable
command $cwd/render-script
autodump done # off, done, donefail
cpus vaio=1@100
# Optional
#donemail you@foo.com # "-" to disable
#notes This is a test
#state Pause
#logflags keepall
#frames 1-10=Hold:Hello_world
#criteria ( linux | irix | osf1 )
EOF
exit $status
|
Submit scripts don't have to be written as csh scripts. Any language
that can pipe text into a command can be used to submit jobs.
The following shows a template submit script written in Perl:
Perl Template Submit
|
#!/usr/bin/perl
my $me = `logname`; chomp($me);
my $pwd = `pwd`; chomp($pwd);
open(SUBMIT, "|rush -submit");
print SUBMIT <<"EOF";
title mytest
ram 10
frames 1-100
logdir $pwd/logs
command $pwd/render-script
donemail $me
autodump off
criteria ( linux | irix )
cpus +any=10\@100
EOF
close(SUBMIT);
if ( $? >> 8 )
{ print STDERR "-- submit failed --\n"; exit(1); }
exit(0);
|
And the same program written in C:
C Template Submit Script
|
#include <stdio.h>
#include <unistd.h>
/* C EXAMPLE: Template Submit
*
* UNIX COMPILE:
* cc renderit.c -o renderit
*
* WINDOWS COMPILE:
* vcvars32
* cl renderit.c
*/
#ifdef _WIN32
#include <direct.h>
#define popen _popen
#define pclose _pclose
#endif
int main(int argc, char *argv[])
{
char *me = getlogin();
char cwd[1024]; getcwd(cwd, 1023);
if ( ( fp = popen("rush -submit", "w") ) == NULL )
{ perror("couldn't popen(rush -submit)"); exit(1); }
fprintf(fp, " title mytest\n"
" ram 10\n"
" frames 1-100\n"
" logdir $pwd/logs\n"
" command $pwd/renderit\n"
" donemail $me\n"
" autodump off\n"
" criteria ( linux | irix )\n"
" cpus +any=10@100\n");
if ( pclose(fp) != 0 )
{ return(1); }
return(0);
}
|
Perl: Submit Script, Read Back Jobid
Here's a perl script that submits a sleep job, and parses back the jobid into a
variable, which the perl script can then use for other purposes.
Perl Submit and Read Back Jobid
|
#!/usr/bin/perl
# Create rush submit file
my $tmp = "/tmp/.submit.$$";
unless ( open ( SUBMIT, ">$tmp" ) )
{ print "open(>$tmp): $!\n"; exit(1); }
print SUBMIT <<"EOF";
title SHOW/SHOT
frames 1-10
command sleep 30
cpus +any=1
EOF
unless ( close( SUBMIT ) )
{ print "close($tmp): $!\n"; exit(1); }
# Submit the job, parse out jobid
my $out = `rush -submit < $tmp`; unlink ( $tmp );
if ( $out =~ /RUSH_JOBID (\S+)/ ) { $ENV{RUSH_JOBID} = $1; }
else { print STDERR "$out\nSubmit failed.\n"; exit(1); }
print "RUSH_JOBID IS NOW $ENV{RUSH_JOBID}\n";
exit(0);
|
Here's a simple C program that submits a sleep job.
C Programming Example: Simple Submit
|
#include <stdio.h>
main()
{
FILE *fp;
if ( ( fp = fopen("my-submit", "w") ) == NULL )
{ perror("my-submit"); exit(1); }
fprintf(fp, "title TEST\n"
"ram 1\n"
"frames 1-10\n"
"command rush -sleep 300\n"
"cpus +any=10\n");
fclose(fp);
system("rush -submit < my-submit");
}
|
Here's a more complex C program that acts as both a submit
and render script, using recursion to invoke itself. It also
uses pipes to prevent creating the temporary file used to submit
the job in the previous example. Note that it's critical to invoke
this program with an absolute path so the program can
invoke itself correctly from other machines.
There are three versions of this program:
C Programming Example: Submit and Render
|
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
/* C EXAMPLE: Submit and Render
*
* This program acts as both a submit and render script.
* It is important to invoke this program initially with an absolute path,
* so the program can call itself correctly from other machines.
*
* UNIX COMPILE:
* cc filename.c -o filename
*
* WINDOWS COMPILE:
* vcvars32
* cl filename.c
*/
#ifdef _WIN32
#include <direct.h>
#define popen _popen
#define pclose _pclose
#define mkdir(a,b) _mkdir(a)
#endif
int main(int argc, char **argv)
{
if ( argc >= 2 && strcmp(argv[1], "-render") == 0 )
{
/* CALLED AS A RENDER SCRIPT?
* Invoke maya, return exit code.
*/
int t;
char cmd[4096];
sprintf(cmd, "mayabatch -render -s %s -e %s",
getenv("RUSH_FRAME"),
getenv("RUSH_FRAME"));
for ( t=2; t<argc; t++ )
{ strcat(cmd, " "); strcat(cmd, argv[t]); }
fprintf(stderr, "Executing: %s\n", cmd);
t = system(cmd) >> 8;
if ( t != 0 )
{ fprintf(stderr, "MAYA FAILED: EXIT CODE=%d\n", t); exit(1); }
fprintf(stderr, "MAYA SUCCESS\n");
exit(0);
}
else
{
/* CALLED AS A SUBMIT SCRIPT?
* Then prompt for info, and submit the job
*/
FILE *fp;
char title[40];
char frames[40];
char scene[1024];
char cpus[1024];
char cmd[1024];
char logdir[1024];
fprintf(stderr, " Enter title for job: ");
fgets(title, sizeof(title)-1, stdin);
title[strlen(title)-1] = '\0';
fprintf(stderr, " Enter the scene file: ");
fgets(scene, sizeof(scene)-1, stdin);
scene[strlen(scene)-1] = '\0';
fprintf(stderr, "Enter the frame range: ");
fgets(frames, sizeof(frames)-1, stdin);
frames[strlen(frames)-1] = '\0';
fprintf(stderr, " Enter the cpus: ");
fgets(cpus, sizeof(cpus)-1, stdin);
cpus[strlen(cpus)-1] = '\0';
/* MAKE LOGDIR BASED ON TITLE OF JOB
* There are cleaner ways to do this.
*/
{
int oldmask = umask(0);
sprintf(logdir, "//tahoe/net/tmp/%s", title);
if ( mkdir(logdir, 0777) < 0 && errno != EEXIST )
{ perror(logdir); exit(1); }
umask(oldmask);
}
/* SUBMIT THE JOB
* Feed the submit commands down a pipe.
*/
if ( ( fp = popen("rush -submit", "w") ) == NULL )
{ perror("couldn't popen(rush -submit)"); exit(1); }
fprintf(fp, "title %s\n", title);
fprintf(fp, "ram 1\n");
fprintf(fp, "frames %s\n", frames);
fprintf(fp, "logdir %s\n", logdir);
fprintf(fp, "command %s -render %s\n", argv[0], scene);
fprintf(fp, "cpus %s\n", cpus);
pclose(fp);
exit(0);
}
/*NOTREACHED*/
}
|
Perl: Submit and Render Script
|
#!/usr/bin/perl
# PERL EXAMPLE: Submit and Render
#
# This program acts as both a submit and render script.
# It is important to invoke this program initially with an absolute path,
# so the program can call itself correctly from other machines.
#
$|=1;
if ( $ARGV[0] eq "-render" )
{
# CALLED AS A RENDER SCRIPT?
# Invoke maya, return exit code.
my $t;
my $cmd = sprintf("mayabatch -render -s %s -e %s",
$ENV{RUSH_FRAME},
$ENV{RUSH_FRAME});
for ( $t=1; $t<=$#ARGV; $t++ )
{ $cmd .= " $ARGV[$t]"; }
print STDERR "Executing: $cmd\n";
$t = system($cmd) >> 8;
if ( $t != 0 )
{ print STDERR "MAYA FAILED: EXIT CODE=$t\n"; exit(1); }
print STDERR "MAYA SUCCESS\n";
exit(0);
}
else
{
# CALLED AS A SUBMIT SCRIPT?
# Then prompt for info, and submit the job
print STDERR " Enter title for job: ";
my $title = <STDIN>; chomp($title);
print STDERR " Enter the scene file: ";
my $scene = <STDIN>; chomp($scene);
print STDERR "Enter the frame range: ";
my $frames = <STDIN>; chomp($frames);
print STDERR " Enter the cpus: ";
my $cpus = <STDIN>; chomp($cpus);
# MAKE LOGDIR BASED ON TITLE OF JOB
# There are cleaner ways to do this
#
my $logdir = sprintf("//tahoe/net/tmp/%s", $title);
if ( ! -e $logdir )
{
my $oldmask = umask(0);
unless ( mkdir($logdir, 0777) )
{ print STDERR "$logdir: $!\n"; exit(1); }
umask($oldmask);
}
# SUBMIT THE JOB
# Feed the submit commands down a pipe.
#
open(SUBMIT, "|rush -submit");
print SUBMIT <<"EOF";
title $title
ram 1
frames $frames
logdir $logdir
command perl $0 -render $scene
cpus $cpus
EOF
close(SUBMIT);
if ( $? >> 8 )
{ print STDERR "-- submit failed --\n"; exit(1); }
exit(0);
}
|
CSH: Submit and Render Script
|
#!/bin/csh -f
# CSH EXAMPLE: Submit and Render
#
# This program acts as both a submit and render script.
# It is important to invoke this program initially with an absolute path,
# so the program can call itself correctly from other machines.
#
if ( "$1" == "-render" ) then
# CALLED AS A RENDER SCRIPT?
# Invoke maya, return exit code.
set cmd = "mayabatch -render -s $RUSH_FRAME -e $RUSH_FRAME";
shift
set cmd = "$cmd $*:q"
echo "Executing: $cmd"
$cmd
set err = $status
if ( $err != 0 ) then
echo "MAYA FAILED: EXIT CODE=$err\n"
exit 1
endif
echo "MAYA SUCCESS"
exit 0
else
# CALLED AS A SUBMIT SCRIPT?
# Then prompt for info, and submit the job
echo -n " Enter title for job: ";
set title = "$<"
echo " Enter the scene file: ";
set scene = "$<"
echo "Enter the frame range: ";
set frames = "$<"
echo " Enter the cpus: ";
set cpus = "$<"
# MAKE LOGDIR BASED ON TITLE OF JOB
# There are cleaner ways to do this
#
set logdir = "//tahoe/net/tmp/$title"
if ( ! -e $logdir ) then
umask 0
mkdir -m 0777 $logdir
if ( $status ) exit 1
endif
# SUBMIT THE JOB
# Feed the submit commands down a pipe.
#
cat << EOF | rush -submit
title $title
ram 1
frames $frames
logdir $logdir
command csh -f $0 -render $scene
cpus $cpus
EOF
exit $status
endif
|
|