By | 15 May 2016

Executing System Commands from PeopleCode and Getting STDOUT

I recently had a need to execute some OS system level calls in PeopleCode but I needed to get the output of the command call. I did some googling and found that some other bloggers had already done this. I am documenting this on my own blog as I can think of many future uses of this for some code I plan on releasing this year.

I actually needed to get the OS version for Oracle support. However, I did not want to wait for a response from the system admins. So I wrote a quick function in my Unit Test Page to return the OS version.

Here is the PeopleCode.

Function getOSVersion() returns string
   &commandPath = "cat /etc/redhat-release";

   Local JavaObject &runtime = GetJavaClass("java.lang.Runtime").getRuntime();

   Local JavaObject &process = &runtime.exec(&commandPath);

   Local JavaObject &inputStreamReader = CreateJavaObject("java.io.InputStreamReader", &process.getInputStream());
   Local JavaObject &bufferedReader = CreateJavaObject("java.io.BufferedReader", &inputStreamReader);
   Local integer &returnCode = &process.waitFor();

   Local any &inputLine;
   Local any &fullOutput;


   While True
      &inputLine = &bufferedReader.readLine();
      If (&inputLine <> Null) Then
         &fullOutput = &fullOutput | &inputLine;
      Else
         Break;
      End-If;
   End-While;

    return &fullOutput ;


End-Function;

This function gets the Linux OS version of a RedHat server by calling the operating system CAT command with some parameters.

The full command is: cat /etc/redhat-release

You could substitute any executable in that process and get the results.

If you need to look for the return code you can see this line from above.

Local integer &returnCode = &process.waitFor();

My example code does not do anything with the &returnCode but if the executable you are calling relies on return codes you can use that integer to respond to the return code.

Additional Reading

I have to give full credit to Jim Marion as I did not know this was possible until a google search found that he had written a great article which this code was adopted from called AppEngine Output Tricks, Reporting, Logging, Etc.

Also @vindac wrote a short post Execute shell commands using Java Runtime in PeopleCode that has a slight variation that was also helpful.

Article Categories

Do you want to become a CI Expert?

If you want to learn more about developing using Component Interface then check out our CI Training Video.