GRASS and Shell
It is fairly easy to write a GRASS job as Shell script which launches GRASS, does the operation and cleans up the temporary files.
What's this?
Often it is convenient to automate repeated jobs. GRASS can be controlled via user scripts to facilitate daily work. How to start? Using command line is a kind of writing scripts without saving them - so, you may start to write your first script by saving the executed commands in a text file (use your preferred editor to do so, ideally save the script file in ASCII format).
A first script
Comments should be started with a '#' character. The first line indicates the shell interpreter to be used, here "sh" which is always in the /bin/ directory.
Silly example:
#!/bin/sh # my first script # plot current region settings g.region -p # leave with exit status 0 which means "ok": exit 0
Save this in a file "myscript.sh" and run it within GRASS GIS from the command line:
sh myscript.sh
It should print the current region settings and finish.
Setting the variables
You have to set a couple of variables to enable GRASS command to run (see 'GRASS Batch jobs' below for easier solution!).
See this post to the mailing list. Proabably need to update this wiki page with that information.
# Example in bash shell syntax: # path to GRASS binaries and libraries: export GISBASE=/usr/local/grass64 export PATH=$PATH:$GISBASE/bin:$GISBASE/scripts export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GISBASE/lib # use process ID (PID) as lock file number: export GIS_LOCK=$$ # settings for graphical output to PNG file (optional) export GRASS_PNGFILE=/tmp/grass6output.png export GRASS_TRUECOLOR=TRUE export GRASS_WIDTH=900 export GRASS_HEIGHT=1200 export GRASS_PNG_COMPRESSION=1
The following variable defines where the GRASS settings file is stored. This can be anywhere on the system. You could also generate the '.grassrc6' on the fly in your script, even with different name. Just indicate it correctly:
# path to GRASS settings file export GISRC=$HOME/.grassrc6
Now you can test:
# this should print the GRASS version used: g.version # other calculations go here ...
You should cleanup internal tmp files like this:
# run GRASS' cleanup routine $GISBASE/etc/clean_temp # remove session tmp directory: rm -rf /tmp/grass6-$USER-$GIS_LOCK
If this works, you can launch other GRASS commands. The approach works within Shell scripts and also in the command line terminal.
Example
- GRASS shell script job to generate a Recent Earthquakes Map
Parallel GRASS jobs
See Parallel GRASS jobs for openMosix, PBS etc.
GRASS Batch jobs
There is (now) an alternative method to easily run jobs in GRASS from a collection of commands in a shell script file. Just define the environmental variable GRASS_BATCH_JOB with the shell script file containing GRASS (or whatever) commands, preferably with full path. Then launch GRASS and it will be executed. It is best to launch GRASS in -text mode and to provide GISDBASE/location/mapset as parameters. The job script needs executable file permissions (chmod).
Example:
chmod u+x $HOME/my_grassjob.sh export GRASS_BATCH_JOB=$HOME/my_grassjob.sh grass64 ~/grassdata/spearfish60/neteler/
The grass64 command starts GRASS in the given mapset, executes the contents of the job file and leaves GRASS. Since the normal startup/closure is used, all tmp files are properly removed.
Note: The $HOME variable (or the ~ shortcut) cannot be used in the batch job since the variables are not available here.
To deactivate the batch job mode, run (bash example):
unset GRASS_BATCH_JOB
Unattended execution
- GNU_Screen is another extremely valuable tool if you need to detatch and leave long-running processes unattended. It is well worth your time to learn how to use it if you run scripts on remote systems. There are many good tutorials on the web.
- Usage:
- Run "screen" in the terminal. You will reach again the command line but now in screen mode. Now start GRASS.
- - To disconnect from the session press Control-A, Control-D.
- - To list your screens type "screen -ls" (to find it back)
- - To reconnect with a disconnected screen run "screen -r [identifier]" (the "identifier" you need only if you have several screens running)
- Enjoy.
- Run "screen" in the terminal. You will reach again the command line but now in screen mode. Now start GRASS.
- Along with the "nohup" (no hang-up) command you can login to your machine, launch the job and leave the machine again.
The process will continue after you logged off when you start it with nohup:
nohup grass64 ~/grassdata/spearfish60/neteler/ &
Receive a notification when finished
Maybe put email notification at the end of 'my_grassjob.sh' using the "mail" or the "mutt" program, for example like this:
echo "Finished at `date`" > /tmp/done.txt && \ EDITOR=touch mutt -s "Job done" \ me@mydomain.org < /tmp/done.txt && rm -f /tmp/done.txt
or like this:
mail -s "GRASS job $0 finished" me@mydomain.org <<EOF GRASS GIS has finished the batch job $0 EOF
See also
- Other GRASS environment variables
- SWIG bindings (Python/Perl/etc)
- Advance bash-scripting guide [1]