Executing a system command
is relatively simple – once you’ve seen it done the first time.
It involves the use of two Java classes, the Runtime class and the Process class. Basically, you use the exec method
of the Runtime class to run the command as a separate process.
Invoking the exec method returns a Process object for managing the subprocess. Then you use the getInputStream()
and getErrorStream()
methods of the Process
object to read the normal output of the command, and the error output of the command. What you do with the output of the command executed is entirely up to you and the application you’re creating.
The ProcessBuilder.start()
and Runtime.exec
methods create a native process and return an instance of a subclass of Process
that can be used to control the process and obtain information about it.
The class Process
provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.
The methods that create processes may not work well for special processes on certain native platforms, such as native windowing processes, daemon processes, Win16/DOS processes on Microsoft Windows, or shell scripts.
By default, the created subprocess does not have its own terminal or console. All its standard I/O (i.e. stdin, stdout, stderr) operations will be redirected to the parent process, where they can be accessed via the streams obtained using the methods getOutputStream()
, getInputStream()
, and getErrorStream()
.
The parent process uses these streams to feed input to and get output from the subprocess. Because some native platforms only provide limited buffer size for standard input and output streams, failure to promptly write the input stream or read the output stream of the subprocess may cause the subprocess to block, or even deadlock.
Below are two simple Java Examples for your reference.
Example-1. Execute mkdir, ls -ltra and ping in Java
- Create file CrunchifyCommandJava.java
- Execute
mkdir /Users/ashah/Desktop/new-folder
- Execute
ls -ltra /Library
- Execute
ping crunchify.com
package crunchify.com.tutorials; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; /** * @author Crunchify.com * Execute Linux commands using Java. We are executing mkdir, ls -ltra and ping in this tutorial */ public class CrunchifyCommandJava { public printOutput getStreamWrapper(InputStream is, String type) { return new printOutput(is, type); } public static void main(String[] args) { Runtime rt = Runtime.getRuntime(); CrunchifyCommandJava rte = new CrunchifyCommandJava(); printOutput errorReported, outputMessage; try { Process proc = rt.exec("mkdir /Users/ashah/Desktop/new-folder"); errorReported = rte.getStreamWrapper(proc.getErrorStream(), "ERROR"); outputMessage = rte.getStreamWrapper(proc.getInputStream(), "OUTPUT"); errorReported.start(); outputMessage.start(); } catch (IOException e) { e.printStackTrace(); } try { Process proc = rt.exec("ls -ltra /Library"); errorReported = rte.getStreamWrapper(proc.getErrorStream(), "ERROR"); outputMessage = rte.getStreamWrapper(proc.getInputStream(), "OUTPUT"); errorReported.start(); outputMessage.start(); } catch (IOException e) { e.printStackTrace(); } try { Process proc = rt.exec("ping crunchify.com"); errorReported = rte.getStreamWrapper(proc.getErrorStream(), "ERROR"); outputMessage = rte.getStreamWrapper(proc.getInputStream(), "OUTPUT"); errorReported.start(); outputMessage.start(); } catch (IOException e) { e.printStackTrace(); } } private class printOutput extends Thread { InputStream is = null; printOutput(InputStream is, String type) { this.is = is; } public void run() { String s = null; try { BufferedReader br = new BufferedReader( new InputStreamReader(is)); while ((s = br.readLine()) != null) { System.out.println(s); } } catch (IOException ioe) { ioe.printStackTrace(); } } } }
Make sure to change path accordingly in above program as per your system settings.
Eclipse console Output:
Just run above program as a Java Application and you will see similar result.
mkdir: /Users/ashah/Desktop/new-file-created.txt: File created total 0 drwxr-xr-x 3 root wheel 96 Aug 17 2018 Compositions drwxr-xr-x@ 2 root wheel 64 Aug 17 2018 GPUBundles drwxr-xr-x 2 root wheel 64 Aug 17 2018 SystemProfiler drwxr-xr-x 2 root wheel 64 Aug 17 2018 ColorPickers -rw-r--r-- 1 root wheel 0 Aug 17 2018 .localized drwxr-xr-x 2 root wheel 64 Aug 17 2018 StartupItems drwxr-xr-x 3 root wheel 96 Aug 17 2018 Speech drwxr-xr-x 4 root wheel 128 Aug 17 2018 Ruby drwxr-xr-x@ 2 root wheel 64 Aug 17 2018 CoreAnalytics drwxr-xr-x 3 root wheel 96 Aug 17 2018 DirectoryServices drwxr-xr-x 5 root wheel 160 Aug 17 2018 WebServer drwxr-xr-x 3 root wheel 96 Aug 17 2018 Perl drwxr-xr-x 2 root wheel 64 Aug 17 2018 ScriptingAdditions drwxr-xr-x 2 root wheel 64 Aug 17 2018 Keyboard Layouts drwxr-xr-x 3 root wheel 96 Aug 17 2018 Graphics drwxr-xr-x 3 root wheel 96 Aug 17 2018 Python drwxr-xr-x 8 root wheel 256 Oct 11 16:51 User Pictures drwxr-xr-x 3 root wheel 96 Oct 11 16:51 Screen Savers drwxr-xr-x 51 root wheel 1632 Oct 11 16:51 Desktop Pictures drwxr-xr-x 2 root wheel 64 Oct 18 18:51 Contextual Menu Items drwxr-xr-x 2 root wheel 64 Oct 18 18:51 Components drwxr-xr-x 5 root wheel 160 Oct 21 16:03 OpenDirectory drwxr-xr-x 2 root wheel 64 Oct 23 20:43 Input Methods drwxr-xr-x 4 root wheel 128 Oct 29 23:49 Video drwxr-xr-x 3 root wheel 96 Nov 5 21:20 Messages drwxr-xr-x@ 3 root wheel 96 Nov 12 22:37 MessageTracer drwxr-xr-x 3 root wheel 96 Nov 12 22:55 CoreMediaIO drwxr-xr-x 3 root wheel 96 Nov 29 23:38 Sandbox drwxr-xr-x 3 root wheel 96 Nov 29 23:38 Filesystems drwxr-xr-x 8 root wheel 256 Nov 29 23:40 Image Capture drwxr-xr-x 4 root wheel 128 Nov 29 23:41 Java drwxr-xr-x 4 root wheel 128 Nov 29 23:41 QuickTime drwxr-xr-x 10 root wheel 320 Nov 29 23:45 Scripts drwxrwxr-t 182 root admin 5824 Nov 29 23:47 Fonts drwxr-xr-x 4 root wheel 128 Nov 29 23:49 QuickLook drwxr-xr-x 4 root wheel 128 Nov 29 23:49 Spotlight drwxr-xr-x 37 root wheel 1184 Nov 29 23:50 Modem Scripts drwxr-xr-x 4 root wheel 128 Feb 11 13:00 ColorSync drwxr-xr-x 4 root wheel 128 Feb 11 13:04 Security drwxr-xr-x 8 root wheel 256 Feb 11 13:04 PDF Services drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Catacomb drwxr-xr-x 9 root wheel 288 Feb 11 13:05 Frameworks drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Automator drwxr-xr-x 10 root wheel 320 Feb 11 13:05 Audio drwxr-xr-x 3 root wheel 96 Feb 11 13:05 Tanium drwxr-xr-x+ 68 root wheel 2176 Feb 11 13:05 . drwxr-xr-x 3 root admin 96 Feb 11 13:05 Developer drwxr-xr-x 8 root wheel 256 Feb 11 13:05 Documentation drwxr-xr-x 4 root wheel 128 Feb 11 13:05 DropboxHelperTools drwxrwxr-x 14 root admin 448 Feb 11 13:07 Receipts drwxr-xr-x 4 root wheel 128 Feb 11 13:07 SystemMigration drwxr-xr-x@ 4 root wheel 128 Feb 11 13:10 StagedExtensions drwxr-xr-x 14 root wheel 448 Feb 11 18:26 Widgets drwxr-xr-x 13 root wheel 416 Feb 11 18:26 Extensions drwxr-xr-x 29 root wheel 928 Feb 11 18:35 .. drwxr-xr-x 9 root wheel 288 Feb 17 12:38 Logs drwxrwxrwt 11 root admin 352 Feb 22 13:29 Caches drwxr-xr-x 11 root wheel 352 Feb 22 13:36 LaunchAgents drwxr-xr-x 2 root wheel 64 Feb 22 13:36 PreferencePanes drwxr-xr-x 9 root wheel 288 Feb 22 13:36 Internet Plug-Ins drwxr-xr-t 7 root wheel 224 Feb 22 13:36 PrivilegedHelperTools drwxr-xr-x 18 root wheel 576 Feb 22 13:36 LaunchDaemons drwxr-xr-x 25 root admin 800 Feb 22 16:03 Application Support dr-xr-xr-x 9 root wheel 288 Feb 25 10:24 Printers drwxr-xr-x@ 5 root wheel 160 Feb 25 10:24 Updates drwxr-xr-x 10 root wheel 320 Feb 25 14:12 Keychains drwxr-xr-x 25 root wheel 800 Feb 26 08:07 Managed Preferences drwxr-xr-x 67 root wheel 2144 Feb 26 08:07 Preferences PING crunchify.com (35.197.114.216): 56 data bytes 64 bytes from 35.197.114.216: icmp_seq=0 ttl=54 time=70.275 ms 64 bytes from 35.197.114.216: icmp_seq=1 ttl=54 time=73.876 ms 64 bytes from 35.197.114.216: icmp_seq=2 ttl=54 time=68.134 ms 64 bytes from 35.197.114.216: icmp_seq=3 ttl=54 time=75.951 ms 64 bytes from 35.197.114.216: icmp_seq=4 ttl=54 time=70.205 ms
Example-2.
- CrunchifyRunCommand.java
- Execute command
ps -few
to get list of all processes running on your system.
package crunchify.com.tutorials; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * @author Crunchify.com * Execute ps -few command in Java to get list of all processes */ public class CrunchifyRunCommand { public static void main(String[] args) { String s = null; try { // Process provides control of native processes started by ProcessBuilder.start and Runtime.exec. // getRuntime() returns the runtime object associated with the current Java application. Process p = Runtime.getRuntime().exec("ps -few"); BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); // read the output from the command System.out.println("Here is the standard output of the command:\n"); while ((s = stdInput.readLine()) != null) { System.out.println(s); } // read any errors from the attempted command System.out.println("Here is the standard error of the command (if any):\n"); while ((s = stdError.readLine()) != null) { System.out.println(s); } System.exit(0); } catch (IOException e) { System.out.println("exception happened - here's what I know: "); e.printStackTrace(); System.exit(-1); } } }
Eclipse console Output:
Here is the standard output of the command: UID PID PPID C STIME TTY TIME CMD 0 1 0 0 Fri09PM ?? 7:14.76 /sbin/launchd 0 44 1 0 Fri09PM ?? 0:09.67 /usr/sbin/syslogd 0 45 1 0 Fri09PM ?? 0:12.95 /usr/libexec/UserEventAgent (System) 0 49 1 0 Fri09PM ?? 0:04.41 /System/Library/PrivateFrameworks/Uninstall.framework/Resources/uninstalld 0 50 1 0 Fri09PM ?? 0:26.75 /usr/libexec/kextd 0 51 1 0 Fri09PM ?? 2:00.76 /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Support/fseventsd 0 53 1 0 Fri09PM ?? 4:16.25 /usr/local/jamf/bin/jamf launchDaemon -enforceRestrictions -monitorNetworkStateChanges 0 54 1 0 Fri09PM ?? 0:01.29 /System/Library/PrivateFrameworks/MediaRemote.framework/Support/mediaremoted 55 57 1 0 Fri09PM ?? 0:01.23 /System/Library/CoreServices/appleeventsd --server 0 58 1 0 Fri09PM ?? 4:21.14 /usr/sbin/systemstats --daemon 0 60 1 0 Fri09PM ?? 0:41.10 /usr/libexec/configd 0 61 1 0 Fri09PM ?? 1:03.98 /System/Library/CoreServices/powerd.bundle/powerd 0 62 1 0 Fri09PM ?? 0:00.89 /Library/Application Support/JAMF/Jamf.app/Contents/MacOS/JamfDaemon.app/Contents/MacOS/JamfDaemon 0 65 1 0 Fri09PM ?? 0:43.84 /usr/libexec/logd 0 66 1 0 Fri09PM ?? 0:00.02 /usr/libexec/keybagd -t 15 0 73 1 0 Fri09PM ?? 3:26.45 /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Support/mds 240 74 1 0 Fri09PM ?? 0:00.11 /System/Library/CoreServices/iconservicesd 0 75 1 0 Fri09PM ?? 0:03.39 /usr/libexec/diskarbitrationd 0 79 1 0 Fri09PM ?? 0:00.73 /System/Library/CoreServices/backupd.bundle/Contents/Resources/backupd-helper -launchd 0 80 1 0 Fri09PM ?? 0:03.84 /usr/libexec/coreduetd 0 84 1 0 Fri09PM ?? 2:30.59 /usr/libexec/opendirectoryd 0 85 1 0 Fri09PM ?? 0:17.45 /System/Library/PrivateFrameworks/ApplePushService.framework/apsd 0 86 1 0 Fri09PM ?? 0:00.67 /System/Library/PrivateFrameworks/Noticeboard.framework/Versions/A/Resources/nbstated 0 87 1 0 Fri09PM ?? 0:16.91 /System/Library/CoreServices/launchservicesd 266 88 1 0 Fri09PM ?? 0:06.48 /usr/libexec/timed 0 89 1 0 Fri09PM ?? 0:25.37 /usr/sbin/securityd -i 213 90 1 0 Fri09PM ?? 0:01.16 /System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/Resources/usbmuxd -launchd 205 92 1 0 Fri09PM ?? 0:59.64 /usr/libexec/locationd 0 94 1 0 Fri09PM ?? 0:00.08 autofsd 244 95 1 0 Fri09PM ?? 0:03.06 /usr/libexec/displaypolicyd -k 1 0 98 1 0 Fri09PM ?? 0:11.56 /usr/libexec/dasd 0 99 1 0 Fri09PM ?? 0:00.71 /System/Library/PrivateFrameworks/Heimdal.framework/Helpers/kdc 0 103 1 0 Fri09PM ?? 0:00.87 /Library/Tanium/TaniumClient/TaniumClient -d 110048994 104 1 0 Fri09PM ?? 0:34.02 /System/Library/CoreServices/loginwindow.app/Contents/MacOS/loginwindow console 0 105 1 0 Fri09PM ?? 0:00.76 /System/Library/CoreServices/logind 0 106 1 0 Fri09PM ?? 0:00.66 /System/Library/PrivateFrameworks/GenerationalStorage.framework/Versions/A/Support/revisiond 0 107 1 0 Fri09PM ?? 0:00.03 /usr/sbin/KernelEventAgent 0 109 1 0 Fri09PM ?? 1:58.55 /usr/sbin/bluetoothd 261 110 1 0 Fri09PM ?? 13:48.55 /usr/libexec/hidd 0 112 1 0 Fri09PM ?? 0:06.37 /usr/libexec/corebrightnessd --launchd 0 113 1 0 Fri09PM ?? 0:04.23 /usr/libexec/AirPlayXPCHelper 0 114 1 0 Fri09PM ?? 1:07.01 /usr/sbin/notifyd 241 116 1 0 Fri09PM ?? 0:11.70 /usr/sbin/distnoted daemon 0 119 1 0 Fri09PM ?? 0:03.99 /usr/libexec/amfid 0 123 1 0 Fri09PM ?? 0:09.47 /usr/libexec/syspolicyd 0 124 1 0 Fri09PM ?? 0:05.81 /System/Library/Frameworks/Security.framework/Versions/A/XPCServices/authd.xpc/Contents/MacOS/authd 0 142 1 0 Fri09PM ?? 1:31.63 /usr/sbin/cfprefsd daemon 0 143 1 0 Fri09PM ?? 0:23.54 /System/Library/CoreServices/coreservicesd 0 166 1 0 Fri09PM ?? 0:21.34 /System/Library/PrivateFrameworks/CoreDuetContext.framework/Resources/contextstored
These are some of the processes running on my MacBook Pro. There are quite a few more but pasted very few.
I hope this tutorial helps you run any linux, macOS terminal commands using simple Java program. Let me know for any questions.