GRID Processing at Stern
Contents
- 1 Introduction
- 1.1 How Do I Know If I Should Use the Stern GRID
- 1.2 Sun Grid Engine (SGE)
- 1.3 Resource Distribution
- 1.4 Array Task Capabilities
- 2 Getting started
- 2.1 Logging In
- 2.2 Your Home Directory
- 3 Using the SGE
- 3.1 Simple Job
- 3.2 Job With Options
- 3.3 Array Job
- 3.4 Sequenced Array Job
- 3.5 Running a Matlab Job
- 3.6 Running Parallel Matlab Jobs
- 3.7 Running a SAS Job
- 3.8 Running a Stata Job
- 3.9 Running an R Job
- 4 More SGE Topics
- 4.1 Monitoring a job with qstat
- 4.2 Passing an environment variable to a job
- 4.3 Passing entire environment to a job
- 4.4 Summary of Commands, Options and Resources
- 5 Troubleshooting
Introduction
SCRC supports a moderate size collection of computers, called the Stern GRID, which allow researchers to attack problems that
are computationally challenging or that require large amounts of disk storage. To distribute the software and hardware resources equitably a scheduling system called the Sun Grid Engine (SGE) is used. For statistics on usage see Stern GRID usage reports.
How Do I Know If I Should Use the Stern GRID
Here are some typical examples for using the Stern GRID.
- You expect your job to run longer than an hour.
- You expect your job needs a large amount of disk space or processing power.
- You have many jobs and would like them to run on several computers concurrently to speed up processing time.
- You want to run the same program with many different datasets.
- You want to run the same program but need to systematically change a parameter inside the program.
- You need to use a particular application that is installed only on specific computers in the Stern GRID.
Sun Grid Engine (SGE)
The Sun Grid Engine (SGE) is a sophisticated scheduling system for distributing jobs across a heterogeneous group (a grid) of cooperating computers. Users of the Stern GRID need only know about the requirements of their job, and need not know about all of the different computers that might be able to process their job.
Users describe the processing they need to do by creating a small SGE submission script that tells the SGE software how to run the job and what the special characteristics of the job are. They then submit their request via the shell script to the SGE. The SGE finds the computer(s) that best satisfy the user’s requirements and runs the job.
Resource Distribution
This approach allows efficient use of all the resources available, as well as providing the ability to make sure that resources are used equitably (i.e. one user can’t take over all of the resources). This is the standard approach used in almost all high performance computing environments.
Array Task Capabilities
The SGE is particularly effective for array tasks, such as simulation, that can be divided into a number of smaller independent pieces. Each piece can run simultaneously on separate machines.
For example, suppose you want to run a simulation with 120,000 trials, and each trial will take 6 seconds of processing. In a normal environment, your simulation will take 720,000 seconds, or 12,000 minutes, or 200 hours of processing. This would take weeks to run. However, if you divide your simulation into 10 runs, each of which does 12,000 trials, you will have your output in 1/10th of the time, i.e. days instead of weeks. See “Array job” below for an example.
Another type of array task is a sequenced array job, where, the processing order of the runs can be specified. For example, say you have a post-processing run that uses as input the output of 10 other runs, i.e., all 10 runs must complete before the 11th post-processing run can start. The SGE can be configured so that you submit all 10+1 runs together, it knows to wait until the first 10 runs are finished before executing the 11th post-processing run. See Sequenced Array Job for an example.
Getting started
Logging In
To log in to the Stern GRID see Stern GRID Access. For Linux basics see Linux Basics.
Your Home Directory
Once logged in to the Stern GRID, you are by default in your home directory. Your home directory resides on a server that is separate to but accessible from any computer in the Stern GRID.
Using the SGE
To use the SGE, you must create a “submission script” that contains the commands and programs you want to execute. The script may also contain options or instructions that control the behavior of the SGE.
Simple Job
The most basic type of SGE submission script has no options. It consists entirely of one or more commands to execute. While you will likely never use such a simple script, it illustrates the SGE qsub concept. For example, the following script executes one command and prints “hello world” to the standard output. Make sure that this script is executable (chmod a+rx hello.sge); see Linux Basics for an explanation about file permissions. Try it.
#
# hello.sge
# This script prints “hello world” to stdout
#
echo “hello world”
This script does not set any SGE options. You submit your script (or job) to the SGE queuing system using the qsub command.
After submission, you should see a message similar to:
Once the job has completed, two files are created and placed in your home directory:
hello.sge.o#
where # is the job ID assigned by SGE. The e# file contains output from standard error and the o# file contains output from standard out. If your job ran successfully, the e# file should be empty and the o# file should contain the text “hello world”.
Job With Options
Options define the specific requirements of the job to the SGE. A typical job will have options. In the submission script, option lines begin with #$. Try it.
#
# hello.sge
# This script prints “hello world” to stdout
#
# Name this job “helloJob”
#$ -N helloJob
#
# Use bash shell
#$ -S /bin/bash
#
# Put error and output results in the current working directory
# i.e., the directory you ran this script from
#$ -cwd
#
# Limit the time this job runs to 5 minutes
# Shorter running jobs have more possible machines onto which
# the job can be scheduled. It is to your advantage to estimate
# the run time as accurately as you can.
# If you do not specify h_cpu it defaults to 5 hours.
#$ -l h_cpu=00:05:00
#
# Send an email at end of job, “e”, and if aborted, “a”
# If a job runs out of time, it will abort and a corresponding
# email will be sent.
#$ -m e
#$ -m a
#
# Specify where to send an email if needed
#$ -M genius@stern.nyu.edu, prodigy@gmail.com
#
echo “hello world”
You submit the job as before with the command:
You can see the status of your job by typing the qstat command. If the job is running, qstat reports something similar to this:
———————————————————————————————————————————————————————————————————————————————
55397 0.35 helloJob torvalds r 04/28/2010 13:49:38 test@rnd.stern.nyu.edu 1
Here you can see that the job called “helloJob” has a unique job ID of 55397, and the state of the job is r(unning).
Array Job
Array jobs are a set of related jobs. Every job in the collection is assigned a task ID which can be used in the job script to control the behavior of the job. This method works well for simulation tasks where you want to repeat a job many times each with a different input file.
For jobs running SAS, R, and matlab, the task ID can be used inside the program to control the behavior of the program. See examples for SAS, R, and Matlab.
Consider the following submission script called array.sge. We want to submit the C program called analysis to the SGE with 100 different data sets (data.1 to data.100).
#
# array.sge
# This script runs the C program “analysis” with 100 different data sets
#
# SGE options
#$ -N analysisJob # Name this job analysisJob
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#$ -l h_cpu=20:00:00 # Limit time to 20 hours (default 5 hrs)
#$ -m ea # send email at end of job and if aborted
#$ -M user@stern.nyu.edu # Specify where to send an email if needed
# Run the analysis program.
# Use as input the data file corresponding to the
# current task ID
./analysis < data.$SGE_TASK_ID
You submit the job using qsub and the parameter -t to specify the range of task IDs.
The SGE will run the job 100 times, varying the environment variable $SGE_TASK_ID from 1 to 100. The SGE system schedules concurrently as many jobs as it can depending on the current availability of computers in the Stern GRID. Each job has its own o# and e# file in the form:
array.sge.o#.$
where # is the job ID and the $ is the task ID, i.e., analysisJob.e(job_ID).(task_ID).
Sequenced Array Job
Running jobs sequentially rather than concurrently is very useful for multistage processing. For example say we run 10 jobs concurrently using the array method. Next, we want to post-process the output of the first 10 jobs into a single result. We can specify that the post-processing job not begin until the first 10 jobs have completed.
To have a job wait for another job, add the -hold_jid job1_ID option to your post-processing script.
As an example, say we have two scripts sequence1.sge and sequence2.sge. The first script, sequence1.sge runs 10 times. Each task takes a random length of time to complete. It then appends a random number to result.list. The second script, sequence2.sge runs after all of the sequence1.sge tasks have completed. It sorts result.list into result.sorted. Try it.
#
# sequence1.sge
# this script sleeps a random number of seconds up to 30
# then outputs a time stamp message to the .o#.$ file
# and then outputs a random number in range 11-20
#
# SGE options
#$ -N stage1Job # Name this job stage1Job
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#
# Sleep for random time between 1 and 30 secs
# This simulates the time it takes to run a job
sleep $(($RANDOM % 30 + 1))
# Print the task ID and the time the task finished
# to compare to the start time of stage 2
echo “stage 1, task $SGE_TASK_ID finished at $(date +%r)”
# create a random number between 11-20
# to represent a pseudo result
echo $(($RANDOM % 10 + 11)) >> result.list
#
# sequence2.sge
# This script sorts the output from stage 1
# in result.list to result.sorted
#
# SGE options
#$ -N stage2Job # Name this job stage2Job
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#$ -hold_jid stage1Job # Ensures that stage2Job does not begin before
# # stage1Job has finished.
#
# Print the time that stage 2 began to compare to
# the time of the last job to finish from stage 1
echo “stage 2 began at $(date +%r)”
# sort the output from stage 1
sort result.list > result.sorted
Now, submit both jobs to the SGE.
qsub sequence2.sge
Typing qstat directly after submitting the jobs shows that they are q(ueued) and w(aiting) to be scheduled. Additionally stage2Job has a h(old) status.
————————————————————————————-
55398 0.00 stage1Job torvalds qw 04/28/2010 14:02:54 1-10:1
55399 0.00 stage2Job torvalds hqw 04/28/2010 14:03:02 1
After a few seconds, qstat shows most of the tasks running for stage1Job while stage2Job is still on hold.
————————————————————————————-
55398 0.35 stage1Job torvalds r 04/28/2010 14:03:08 test@darwin.stern.nyu.edu 1 1
55398 0.25 stage1Job torparvalds r 04/28/2010 14:03:08 test@leda.stern.nyu.edu 1 2
55398 0.21 stage1Job torvalds r 04/28/2010 14:03:08 test@research.stern.nyu.edu 1 3
55398 0.20 stage1Job torvalds r 04/28/2010 14:03:08 test@darwin.stern.nyu.edu 1 4
55398 0.19 stage1Job torvalds r 04/28/2010 14:03:08 test@leda.stern.nyu.edu 1 5
55398 0.19 stage1Job torvalds r 04/28/2010 14:03:08 test@leda.stern.nyu.edu 1 6
55399 0.00 stage2Job torvalds hqw 04/28/2010 14:03:02 1
A peek into the output files for each stage shows that stage 2 did not start until all tasks from stage 1 finished.
stage 1, task 10 finished at 02:03:17 PM
stage 1, task 2 finished at 02:03:21 PM
stage 1, task 3 finished at 02:03:26 PM
stage 1, task 4 finished at 02:03:36 PM
stage 1, task 5 finished at 02:03:30 PM
stage 1, task 6 finished at 02:03:14 PM
stage 1, task 7 finished at 02:03:09 PM
stage 1, task 8 finished at 02:03:11 PM
stage 1, task 9 finished at 02:03:14 PM
stage 2 began at 02:03:38 PM
Running a Matlab Job
In this example we use Matlab’s Financial Toolbox to compute the Black-Scholes put and call option pricing. This example also shows how matlab uses the SGE Task ID variable in the program to vary a parameter value. Try it.
#
# blkscholes.sge
# This script runs a matlab program saving the output into
# a file called blkscholes_#.out
#
# SGE options
#$ -N blkscholesJob # Name this job
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#$ -l matlab=1 # Request job run on machine with a matlab license
#$ -l h_cpu=00:05:00 # Limit time to 5 minutes (default 5 hrs)
#$ -l h_vmem=3200m # jobs on 64 bit nodes and the later versions of matlab require more memory and stack
#$ -l h_stack=512m
#$ -m ea # send email at end of job and if aborted
#$ -M user@stern.nyu.edu # Specify where to send an email if needed
# Run the program.
# direct the standard output to a .out file
matlab < blkscholes.m > blkscholes_$SGE_TASK_ID.out
Submit the job using qsub and the parameter -t to specify the range of task IDs; increment them by 2, i.e., 30, 32, 34, etc.
The Matlab program
%
% Compute the call and put prices of a European stock
% on a non-dividend paying stock using Black_Scholes
%
% Suppose the stock price 3 months from the expiration of an option is $100,
% the exercise price is $95, the risk-free interest rate is 10% per annum,
% and we want to compute the call and put prices for volatilities
% specified at run time.
%
% Use the task id to vary the value of volatility
task_id = getenv(‘SGE_TASK_ID’)
volat = str2num(task_id)
% task id’s must be specified as whole numbers; convert task
% id number to decimal
volat = volat/100;
% set the parameter values
price = 100.0;
strike = 95.0;
rate = 0.1;
time = 0.25;
% compute the call and put prices and write it to
% standard out; see the blkscholes_#.out filell
[call, put] = blsprice(price, strike, rate, time, volat)
% VERY IMPORTANT to use finish at the end of matlab programs when
% submitting to the SGE
finish
Ouput for SGE_TASK_ID = 30 which converts to volatility = 0.3
call = 10.1592
put = 2.8136
Running Parallel Matlab Jobs
Many of the new software applications will automatically use multiple cores (processors) if they are available. This works fine in a dedicated system environment, but plays havoc with the scheduling of jobs on the GRID. It is easy to completely overload one of our nodes by scheduling 8 4 core jobs on a node that only has 8 processors. This has been happening frequently with the more recent versions of matlab.
But there is an easy solution. Tell the GRID scheduler how many cores your job will need, and then restrict matlab to that many cores. In the simplest case, assume that your job usually uses about 4 cores (you can see this by running top while your job is running), then just reserve 4 cores and place your job in a parallel queue.
You can do this by adding two lines to your job script.
#$ -pe PE4 4
This will place your job in the P4 queue, which allows up to 4 cores per job.
The PE4 4 tells Sun Grid Engine that you need 4 cores for this job.
You could also do
and you will get between 2 and 4 cores.
In matlab, you can fix the number of cores you use to what was available by issuing the following commands
LASTN=MaxNumCompThreads(NSLOTS)
Note that the PE4 parallel environment will limit you to a max of 4 cores. If you really need more, contact the staff at research@stern.nyu.edu.
Java also tends to use multiple threads, so you should use the same technique with large java jobs.
Running a SAS Job
In this example we use data about the right- or left-handedness observed in men and women and create a cross tabulation of gender versus handedness.Try it.
#
# crosstab.sge
# This script demonstrates how to run a
# SAS program using the sun grid engine
#
# SGE options
#$ -N crosstabJob # Name this job
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#$ -l Sas=1 # Request job run on machine with a SAS license
#$ -l h_cpu=00:10:00 # Limit job run time to 10 minutes
#$ -m ea # send email at end of job and if aborted
#$ -M user@stern.nyu.edu # Specify where to send an email if needed
# Run the program.
sas -nodms crosstab.sas
Submit the job using qsub.
The SAS program
crosstab.sas
This program creates a cross tabulation between gender and
left- and right-handedness.
*/
DATA Hand;
INPUT gender $ handed $ ;
DATALINES;
Female Right
Male Left
Male Right
Female Right
Female Right
Male Right
Male Left
Male Right
Female Right
Female Left
Male Right
Female Right
PROC FREQ DATA=Hand;
TABLES gender*handed;
RUN;
Here is the cross tabulation output found in the file crosstab.lst.

Running a Stata Job
Here is the SGE submit script for running a simple Stata job. Try it.
#
# newVarEg.sge
# This script runs an example Stata program
#
# SGE options
#$ -N newVarEgJob # Name this job
#$ -S /bin/bash # Use bash shell
#$ -cwd # Put results in current working dir
#$ -l hostname=tesla # stata jobs must be told to run on tesla
#$ -l stata10=1 # Request job run on machine with a 64 bit stat license
#$ -l h_cpu=00:10:00 # Limit time to 10 minutes
#$ -m ea # Send email at end of job and if aborted
#$ -M user@stern.nyu.edu # Specify where to send an email if needed
# Run the program in batch mode
# Capture the screen output in the .log file
stata -b do newVarEg.do > newVarEg.log
The data file, “testData.raw”
2 2 8
9 6 1
The data dictionary specifying format of fixed data file, “testData.dct”
_column(1) int v1 %2f
_column(3) int v2 %2f
_column(5) int v3 %2f
}
The Stata program.
/* newVarEg.do */
/* Input data from fixed field file */
quietly infile using testData
list
/* create new variable */
generate v4=v3-v1
list
/* clear or save data environment */
clear
/* save newVarEg.out */
Running an R Job
In this example we fit a smooth spline model. Try it.
#
# fitspline.sge
# This script demonstrates how to run
# an R job, specifically, how to fit a
# smooth spline model.
# It uses a range of task IDs as a noise parameter
# for the model.
#
# SGE options
#$ -N fitsplineJob # Name this job
#$ -S /bin/bash # Use bash shell (csh by default)
#$ -cwd # Put results in current dir
#$ -l R=1 # Request job run on machine where R is installed
#$ -l h_cpu=00:10:00 # Limit job run time to 10 minutes
#$ -m ea # send email at end of job and if aborted
#$ -M user@stern.nyu.edu # Specify where to send and email if needed
# Run the program
R CMD BATCH –slave fitspline.R fitspline$SGE_TASK_ID.Rout
Submit the job using qsub and the parameter -t to specify the range of task IDs; i.e., 5, 10, 15, 20, 15
The R program
#
# Fit a smooth spline model to randomly generated data.
# Use the task ID to vary the amount of error in the data.
#
# Create random data.
# Set the initial seed forthe random number generator.
# Generate a random integer between 1 and 1000
set.seed( sample(1:1000, 1) )
# Create n random data points.
# Let n = 100 equally spaced values from 0 to 1.
n <- 100
x <- (1:n)/n
# the model in this simulation (no random error)
mval <- ((exp(x/3)-2*exp(-7*x)+sin(9*x))+1)/3
# generate n independent normal random variates with mean 0
# and variance from the task id
tid <- as.integer( Sys.getenv(“SGE_TASK_ID”) )
v <- tid/100
noise <- rnorm(n,0,v)
# y is simulated observed values (model value + noise)
y <- mval+noise
# or you can read data from a file:
# dat<-read.table(“dataset.dat”,header=T)
# attach(dat)
# fit smooth spline on data
# use GCV score and all basis functions
fit <- smooth.spline(x,y,cv=F,all.knots=T)
# create a postscript (PS) file for printing and viewing
r <- paste(“result_”, tid, “.ps”, sep = “”)
postscript(r, height=8, width=10, horizo=F)
#plot data point
plot(x,y,xlab=”x”,ylab=”y”,cex=0.5)
#plot function with noise
lines(x,mval,lty=2)
#plot smooth spline fit
lines(fit$x,fit$y)
#output to PS file
graphics.off()
# To view with Ghostscript, at the
# command line type: ghostscript result_X.ps
# where X is the correspoding task id
The output is a a set of graphs in postscript files. For example, when
the task ID = 10, the error variance is v = 10/100 = 0.1 and generates
the following random model data and the program fits a smooth spline to this data.
This graph is from the result_10.ps file.
More SGE Topics
Monitoring a job with qstat
The qstat command shows the status of your job(s) as well as the available queues. Here are some options to qstat.
| qstat | display info about your current jobs |
| qstat -u ‘*’ | display info about all users’ jobs |
| qstat -g c | summary of queue usage |
| qstat -f | full format summary of all queues |
| qstat -F | resource availability for all queues |
| qstat -explain c | ‘c’ displays the reason for the configuration ambiguous state |
| qstat -explain a | ‘a’ shows the reason for the alarm state |
| qstat -explain A | ‘A’ displays the suspend alarm state reasons |
| qstat -explain E | ‘E’ displays the reason for an error state |
Example 1
————————————————————————————-
56655 0.00 fitsplineJob torvalds qwE 08/27/2010 12:51:48 10-60:10
Here, qstat shows that the job named fitsplineJob with job ID 56655 has three state indicators – E(rror), q(ueued), and w(aiting). It also shows that the it is a multi-task job with task numbers incrementing by 10, i.e., 10, 20, .., 60.
Example 2
————————————————————————————-
56655 0.85 fitsplineJob torvalds r 08/27/2010 12:52:00 test@bohr.stern.nyu.edu 10
56655 0.75 fitsplineJob torvalds r 08/27/2010 12:52:00 test@atlas.stern.nyu.edu 20
56655 0.71 fitsplineJob torvalds r 08/27/2010 12:52:00 test@darwin.stern.nyu.edu 30
56655 0.70 fitsplineJob torvalds r 08/27/2010 12:52:00 test@bohr.stern.nyu.edu 40
56655 0.69 fitsplineJob torvalds r 08/27/2010 12:52:00 test@darwin.stern.nyu.edu 50
56655 0.68 fitsplineJob torvalds r 08/27/2010 12:52:00 medium@bohr.stern.nyu.edu 60
Here we see fitsplineJob is now running the tasks 10, 20, …, 60 simultaneously on six different queues.
Job States
| d(eletion) |
| E(rror) |
| h(old) |
| r(unning) |
| R(estarted) |
| s(uspended) |
| S(uspended) |
| t(ransfering) |
| T(hreshold) |
| w(aiting) |
| E(rror) |
| q(ueued) |
Queue states
| u(nknown) |
| E(rror) |
| h(old) |
| r(unning) |
| R(estarted) |
| s(uspended) |
| S(uspended) |
| t(ransfering) |
| T(hreshold) |
| w(aiting) |
Passing an environment variable to a job
You can pass user defined environment variables to a program by using the -v argument.
Retrieve the variable in your program with getenv. See Running a Matlab Job and Running an R Job for examples.
Passing entire environment to a job
Retrieve any and all environment variables defined at qsub time. See the Linux set command for a complete list.
Summary of Commands, Options and Resources
Commands
| qsub | Submit a SGE script |
| qstat | Status of your job(s) |
| qstat -f | Status of queues |
| qstat -explain c -j job_ID | Why my job won’t run |
| qstat -u “*” | Status of all users’ jobs |
| qdel job_ID | Delete job job_ID |
| qhost | Show the status of hosts, queues and jobs |
| qconf -sc | Show all available resources (-l resource) |
| man SGE_command | complete explanation of SGE_command |
Options
| -hold_jid job_ID, … | The job(s) in jobID, … will not execute unless the corresponding sub-jobs jobs referenced in the comma-separated job_ID list have completed |
| -m b -m e -m a -m s |
b – email is sent at beginning of the job e – email is sent at the end of the job a – email is sent if job is aborted s – email is sent when job is suspended |
| -M username@host, … | Defines the list of email addresses |
| -l resource, … | Request the resource specified |
| -t min-max | Run an array job from index min to index max |
| -N name | Use name as the name for the job. This identifies the job in the queue and sets the name of the files generated by SGE. |
| -S shell | Specify the shell (SGE uses csh by default) |
| -cwd | makes SGE run the .sge file in the current directory. It also means that it will place the output files in the current directory rather than your home directory. |
| -e path/name.eXXXXX | Put the error output file in directory path where XXXXX=$JOB_ID |
| -o path/name.oXXXXX | Put the error output file in directory path where XXXXX=$JOB_ID |
| -q queue_name | Send the job to queue queue_name |
| -pe parallel_environement_slots | Request slots of the parallel environment. e.g. -pe mpich 2 would request 2 MPICH slots |
| -j y | combine output and error files into one file |
Resources (see “qconf -sc” for a complete list)
| 64bit=1 | schedule job(s) on a 64 bit capable computer |
| gauss=1 | schedule job(s) on a computer with gauss |
| h_cpu=HH:MM:SS | hard time limit allowed for job to run |
| h_vmem=xM | x MBs of memory |
| h_stack=xM | x MBs of stack |
| matlab=1 | schedule job(s) on a computer with latest version of Matlab |
| matlab64=1 | schedule job(s) on a computer with Matlab v6.4 |
| matlab73=1 | schedule job(s) on a computer with Matlab v7.3 |
| matlab77=1 | schedule job(s) on a computer with Matlab v7.7 |
| R=1 | schedule job(s) on a computer with R |
| rats=1 | schedule job(s) on a computer with rats |
| ratfor77=1 | schedule job(s) on a computer with ratfor77 |
| sas=1 | schedule job(s) on a computer with SAS |
| Splus=1 | schedule job(s) on a computer with latest version of Splus |
| Splus70=1 | schedule job(s) on a computer with Splus v7.0 |
| stata=1 | schedule job(s) on a computer with stata |
| stata10=1 | schedule job(s) on a computer with 64 bit Stata v10 |
Troubleshooting
| “Error for job xxxxx: can’t get password entry for user “torvalds”. Either the user does not exist or NIS error!” | This error usually means that the job has been submitted to a node that has problems. Contact SCRC at Support. |
| “Warning: no access to tty (Bad file descriptor). Thus no job control in this shell.” | This warning can be ignored. |
