Documentation:Tutorial:MDS ServerOSX - MdsWiki
Personal tools

From MdsWiki

Jump to: navigation, search



As I ( was setting up an MDSplus server on OSX, I ran into differences between what I needed for OSX and the mostly well known recipes for LINUX. This document is primarily about the differences (mostly paths and different implementation of xinetd). This document includes extra information, with some redundant explanations where I thought some redundancy would reduce the confusion on first reading, assembled in one place, about OSX server peccadillos. All this took some rooting around to figure out.

Most other generic MDS information that is not specific to OSX (tree structure, setting up trees, subtrees, networked daemons for processing data, etc) is omitted. Maybe the next iteration.

UNIX script text is a different font (italics) than the narrative text, or in the yellow boxes. We post everything with the caveat that you use it at your own risk.

Get a compiled MDSplus server for OSX

OSX 10.5.8 and earlier

The following is predicated on using Darren Garnier’s mdsplus-2.0.1-macosx-universal build, which you can get from him with a query <garnier@MIT.EDU>. There are several newer distributions from Darren, but they all posed problems with Traverser, due I surmise to Java libraries, Motif libraries, 64 bit compatibility. We think these problems disappear with OS10.6. I have tested this stuff on my machine using OS10.5.7, Intel MacBookPro, CoreDuo 32bit.

OSX 10.6.3 and earlier

I have tested mdsplus-2.2-4-universal-10.5 on SnowLeopard 10.6.3, and it seems to work OK. 64bit libraries are included, so that for example IDL calls in TCL and 64 bit mode dont choke.

OSX 10.6.7 and later

There is a new distro for OSX at, which seems to work for 10.6.7, 10.6.8, 10.7.4 so far. I installed the version named (Oct 14, 2012 MDSplus-4-0-14-osx.pkg). Thank you to whoever you are that is developing this. It can be found at

as of 2012Oct17, I found one error in the


where it looks for


but instead should look for


This error prevents the server from being contacted remotely. You will have to edit (as sudo) one argument in the plist to fix this.

You may have to 1) unload and reload launchctl (see below) 2) force the 64 bit Java to load first, using the Java Preferences application utility.

OSX 10.8.3 and later

The more recent distros of MDSPlus install seem to install everything you will need except the file /etc/mdsip.hosts

Last installation I tried is MDSplus-5-1-4-osx.pkg on OSX 10.8.5 which seems to work OK.

This MDS wiki webpage has a lot of useful information

It tells you where on the web to find the following which must be installed:

- OpenMotif
- XCode Command Line Tools
- FreeTDS
- Xquartz - OS-X 10.8
- Java Run Time (JRT) once from Oracle and once from Apple.

General information about MDSplus

Information about MDSplus is available at [1], although documentation is not always complete. A very useful TechX website with MDSplus server install information exists for generic (I think mostly LINUX, but this link seems to have vanished 2010jan5) servers at [2]

update 2013-01-11

bug in the latest mdsplus release for osx. This prevents one from connecting locally to the local server. Connection works ok from local server looking at other remote servers, but not for localhost.

Created Package Info Jan 10, 2013 MDSplus-5-0-2-osx.pkg

here is the error log message

Fri Jan 11 13:44:04 2013 (0) (pid 6725) Connection received from [] Unable to open hostfile one: /usr/local/mdsplus/local/mdsip.hosts

PROBLEM: mds is searching and failing to find the file - /usr/local/mdsplus/local/mdsip.hosts

FIX: I copied the mdsip.hosts filefrom - /usr/local/mdsplus/etc to this local subdirectory

Set up the server

Set up the DAEMON

add a log directory:

cd /usr/local/mdsplus
mkdir logs

Set permissions - Owner, group and world are the 3 categories of user for which you set permissions. {read = 22 , write=21, execute=20} correspond to the three flavors of permissions. For example: owner=rwx (7), group=rx (5), world=rx (5) permissions should be set for the log directory

chmod 755 logs

You can add the following line to /usr/local/mdsplus/etc/mdsip.hosts

*@* | nobody

where you replace with the domain that you want to serve. Or leave the following 3 lines untouched

/O=Grid/O=National Fusion Collaboratory/OU=MIT/CN=Thomas W. Fredian/ | twf
* | nobody

There is a daemon script (/usr/local/mdsplus/bin/mdsipd), that runs OK as is.

NOTE: the script requires that it runs from the top mdsplus directory, so one should cd to that directory first.

Add data trees

Copy or put data tree files into (for example) /usr/local/mdsplus/expt_data_files, making certain that the individual shot files have 755 (-rwxr-xr-x) permissions. For example, if you start with shot 00001 for the tree named this_expt, then the full file paths would read:


The syntax for files inside the tree is tree_name_shotnumber.*. The file /usr/local/mdsplus/etc/envsyms tells the server which directory to look inside of for the data in the tree. The "tree_name" for this example data set will then be this_expt. You can have several trees corresponding to several experiments if you wish.

Define path to your trees

You can put the tree(s) anywhere you want, but you must tell MDSplus where to look for them. Edit this file


And for this example path, /usr/local/mdsplus/expt_data_files, append the following line(s) to the end

this_expt_path /usr/local/mdsplus/expt_data_files >;

Paths that are no longer needed or temporary can be commented out

#this_expt_path /usr/local/mdsplus/expt_data_files >;

Set up ownership and permissions for tree files

You may wish to declare a new group, for example mds_admin that has read and write permission, and everyone else with only read permissions. This can be done with chown commands. Lately, groups are declared in the System Preferences, by adding a 'user' that you can declare to be a group, then add members to it.

fix up your .bash_profile file.

I use these commands for bash:

echo "Adding MDSplus path and variables"
source /usr/local/mdsplus/

Configure network services (this would be XINETD in LINUX)

However in OSX, xinetd is launched by launchd, with a utility called launchctl, which has an XML plist with parameters. The manual pages for launchd.plist and launchctl have a lot of information (more than you want to know) about this. Files that control launchd are


The mdsip.hosts file is site specific. It lets you control who can connect and what account a remote connect uses to access the data. The /etc/mdsip.hosts location was used on linux based platforms for many years, and also on OSX. Note that this is an absolute path, NOT relative to $MDSPLUS_DIR/, i.e. you must copy from $MDSPLUS_DIR/etc/mdsip.hosts or /usr/local/mdsplus/etc/mdsip.hosts to /etc/mdsip.hosts.

The 2.2.4 install package will automatically write the file /Library/LaunchDaemons/org.mdsplus.mdsipd.plist . The functionality of the various launchd files depends on where you put them, as outlined below. Otherwise you will have to write this file yourself. Later builds of MDSPlus installs for OSX take care of this for you.

/Library/LaunchAgents            Per-user agents provided by the administrator.
~/Library/LaunchAgents          Per-user agents provided by the user.
/Library/LaunchDaemons         System-wide daemons provided by the administrator.
/System/Library/LaunchAgents Per-user agents provided by Mac OS X.
/System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.

The MDSPlus download page has a lot of useful information that is more current ...

launchd requires a plist

information from launchd.plist(5) BSD File Formats Manual, for OS10.6

    launchd.plist -- System wide and per-user daemon/agent configuration files
    This document details the parameters that can be given to an XML property list that can be loaded into
    launchd with launchctl.


Keys can be used to describe the configuration details of your daemon or agent. Property lists are Apple's standard configuration file format. Please see plist(5) for more information. Please note: property list files are expected to have their name end in ".plist". Also please note that it is the expected convention for launchd property list files to be named <Label>.plist. Thus, if your job label is "", your plist file should be named "".


The following file is a plist (/Library/LaunchDaemons/org.mdsplus.mdsipd.plist) that seems to work. The plist provides the arguments $1, $2, and could provide optional arguments $3, $4 that are inputs to the shell script


which invokes the binary


Thanks to Darren Garnier garnier@MIT.EDU for the xml plist. NOTE -- this is different from LINUX, where internet daemons and xinetd are controlled from the file /etc/xinetd.d/mdsip

######### XML PLIST BELOW ###################
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  "">
<plist version="1.0">

Do not forget to delete the hashmarks above, since these are evidently valid comment symbols for xml.

This is for a "one server per connection", and seems to work with "Wait = false" not "true". This XML list advertises the server on Bonjour. Not that anyone has written Bonjour (ZeroConf, Avahi) browser for MDSplus servers...

Load and unload launchd, launchctl

You will need to run:

sudo launchctl load -w /Library/LaunchDaemons/org.mdsplus.mdsipd.plist

Or, to unload (and later reload after you change something)

sudo launchctl unload -w /Library/LaunchDaemons/org.mdsplus.mdsipd.plist

The sudo command will request a sudo or root password.

File permissions and extended attributes

Apple file system sometimes uses “extended attributes”. If you have downloaded the plist from the web, and/or written it with for instance BBEdit, there will be additional file attributes, signified by an appended "@" sign. Check using ls -l on your directory. If so, the launchctl command thinks that the ownership of the plist is ambiguous.

%%%% example %%%%%%%%%%%%%%%%%%%%%%%

 intrator$ ls -l org.mdsplus.mdsipd.plist
-rw-r--r--@ 1 intrator  admin  660 Sep 26 09:17 org.mdsplus.mdsipd.plist

use the xattr command to list the other "extended attributes".

intrator$ xattr -l org.mdsplus.mdsipd.plist
0000   54 45 58 54 00 00 00 00 00 00 00 00 00 00 00 00    TEXT............
0010   00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................


Remove the extended attributes with command xattr,

intrator$ xattr -d org.mdsplus.mdsipd.plist

and check with ls -l to see if the extended attributes have disappeared. %%%%%%

Network name of the local server

The name of your local machine is localhost 8000. The default port for MDSplus is 8000. You can test the server in IDL, or using ssh, or telnet.

Test the server

Through OS 10.5.x

Retrieve data sets: example in IDL, using the proper syntax (note the single quote locations).

IDL> mdsconnect, 'localhost' 
% Compiled module: MDSCONNECT.
% Compiled module: MDSDISCONNECT.
IDL> mdsopen, 'frxl', 6257
% Compiled module: MDSOPEN.
% Compiled module: MDSVALUE.
% Compiled module: MDSCHECKARG.
% Compiled module: MDSISCLIENT.
IDL> data = mdsvalue('dim_of(\THETA_ROGOWS)') 
IDL> time = mdsvalue('dim_of(\THETA_ROGOWS)')

caveat for SnowLeopard users 10.6.x and build 2.2.4

Note also that the mdsconnect, 'localhost' is not supposed to work, according the mavens, because the localhost does not actually establish an IP connection. It seems to work for builds 2.0 installed on Leopard 10.5.x, but on the other hand does not work for build 2.2.4 installed on SnowLeopard. The fix is to append a line in your .bash_profile file in the home directory, that defines the path to whichever tree you wish to look at. For example, for the tree mtf_data, I might use something like

export mtf_data_path="/AFRL_frchx_data_trees/MDS_FRCHX_data"

Then skip the mdsconnect command, and inside IDL, use directly the mdsopen command

latest build for OSX 10.8.3 tested and works OK

Created Package Info Jul 15, 2013 MDSplus-5-0-21-osx.pkg


jTraverser or better yet Traverser allows one to look at tree structure:

jTraverser seems to work on Garnier mdsplus-2.0.1-macosx-universal build example input for FRXL data (FRXL is one LANL experiment)

menu -- file
input --- tree 
   -------------- frxl (note, no need for quotes on the tree name)
input --- shot 
   -------------- 3903

I have not yet figured out how to get the server to serve jTraverser to a remote machine.

Traverser has problems with OSX

Traverser complains about missing dyld. For example the error messages I get are:

zenith:~ intrator$ traverser
dyld: Library not loaded: /opt/local/lib/libMrm.4.dylib
  Referenced from: /usr/local/mdsplus/bin/traverser
  Reason: image not found
Trace/BPT trap


Supposedly installation of Motif will allow traverser to work. I am sure it is simple, but have not yet figured out the right build and compile sequence. There are several newer distributions from Darren, but they all posed problems with Traverser (Java libraries, Motif libraries, 64 bit compatibility, problems which I think disappear with OS10.6). Might need 64 bit hardware (later Apple Intel laptops after CoreDuo, most Intel G5).


Use jScope to look at the data.

java memory

Sometimes large jScope displays consume lots of memory. I dont think this is just an OSX issue. One obscure improvement for the Java entails increasing the memory allocation to 512MB or more. The file is


Here is an example file

#! display MDSplus javascope
java=`which java`
if ( uname -p | grep 64 > /dev/null )
  if (file -L $java } grep 64i-bit > /dev/null )
env \
CLASSPATH=$HOME:$MDSPLUS_DIR/java/classes/jScope.jar:$MDSPLUS_DIR/java/classes \
$java -Xmx512M jScope $1 $2 $3 $4 $5 $6 $7

Increase memory to 512MB by editing the last line in this file to read:

$java -Xmx512M jScope $1 $2 $3 $4 $5 $6 $7

I dont know if even larger memory helps much. You may need to fiddle with the file permissions prior to editing.

editing the signals

To edit signals

  • use the expand expression button
  • right click to 'set up data source'
  • look in the signals list
  • highlight 'Select this item to add new expression' line
  • write in what you wish in Y or X, or other fillable field in the form
  • hit return, and the entry should show up in the signals list
  • multiple signals
    • shot sequence can be specified in jScope shot window, eg
      • 2009082709:2009082712 should yield 4 shots, with sequenced colors
      • [2009082709,2009082711] should yield 2 shots, with sequenced colors

To delete a signal,

  • highlight 'Select this item to add new expression' line
  • use control-delete, not delete as per jScope documentation

IDL and TCL issues

TCL commands can be accessed via IDL. For example

idl> mdstcl, 'set tree test_tree/shot=4'

will open test_tree for viewing but not for edit, shot 4.

Some of the MDS plus builds are for 32 bit architecture, and IDL will launch by default into 64 bit mode, for DualCore and later Apple machines (ie these are 64bit cpu's). If you get error messages, then try launching idl in 32bit mode:

intrator$ idl -32 
You can find out the architecture of MDSPlus with following command in the terminal:

file /usr/local/mdsplus/lib/

If you have the universal build, you will see something like: /usr/local/mdsplus/lib/ Mach-O universal binary with 2 architectures /usr/local/mdsplus/lib/ (for architecture i386): Mach-O bundle i386 /usr/local/mdsplus/lib/ (for architecture ppc): Mach-O bundle ppc


If problems arise open up Console application (inside utilities folder) and look at the mdsplus logs. There should be files: