Com executar un procés de sistema amb Java

Java

GNU

Linux

Java de per si inclou una àmplia col·lecció de classes amb les funcionalitats principals que puguem necessitar, si no l’ofereix en la API és molt possible que hi hagi una llibreria que el proporcioni. Però en algun moment potser se’ns doni el cas que una ordre de sistema retorna la informació o realitza l’acció que necessitem. Pot ser una una ordre de sistema GNU / Linux, Windows o Mac OS X o un script en Java, Python, Ruby o un altre llenguatge de programació. A través de les classe Process i ProcessBuilder ens és possible llançar un procés de qualsevol comanda de sistema i accedir a la seva entrada estàndard, sortida estàndard i sortida d’error.

La classe Process representa el procés que llancem, tenim dues formes d’obtenir un referència aquesta classe, una amb Runtime.getInstance (). exec () i una altra amb la classe ProcessBuilder amb les dues ens serà possible establir variables d’entorn, el directori de treball o redirigir l’entrada i sortida. Obtinguda la referència a una instància de Process amb el mètode getInputStream () llegirem la sortida estàndard de el procés, amb getErrorInputStream () la sortida d’errors i amb getOutputStream () podrem enviar contingut a l’entrada estàndard. Altres mètodes d’utilitat ens permetran conèixer si el procés segueix viu amb isAlive (), obtenir el codi de sortida amb exitValue (), esperar que acabi amb waitFor (). Finalment amb destroy () podem acabar de forma abrupta el procés.

No són de les novetats destacables de Java 8 però des d’aquesta versió es pot establir una espera màxima a l’acabament de l’procés, les variables d’entorn i directori de treball. I més canvis petits però molt útils com aquests haurà estat afegits a altres classes de l’API.

Amb això ens és possible fer qualsevol cosa que el sistema pugui fer segons les comandes que tingui instal·lats o puguin instal·lar-se i això significa que està a l’abast de Java en un sistema GNU / Linux el poder del seu línia de comandaments. Per exemple, suposem que volem saber en un programa Java el temps que porta iniciat un sistema que ens seria útil si volem implementar algun tipus de mètriques de monitoratge amb Spring Boot Actuator. Java no té en el seu API un mètode que proporcioni aquesta informació, però, en GNU / Linux podem saber aquesta dada usant el sistema d’arxius virtual accessible a / proc, concretament a l’arxiu / proc / disponibilitat. Aquest fitxer conté dos nombres el primer és el que ens interessaria sent el nombre de segons transcorreguts des que el sistema es va iniciar i el segon el temps que ha romàs en repòs. El segon número en un sistema amb un processador amb diversos nuclis físics o lògics és probable que es més alt que el primer.

1 2 
$ cat /proc/uptime 1488.79 5666.60 

uptime.sh

Aquest seria el programa Java per conèixer el temps que un sistema GNU / Linux porta arrencat. Primer es crea el procés, s’espera a que acabi i s’obté el seu codi de sortida, s’obté la sortida de l’procés (entrada per al programa), es processa el resultat i s’imprimeixen els segons que porta el sistema iniciat.

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 
package io.github.picodotdev.blogbitix.javaprocess; import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigDecimal; import java.text.MessageFormat; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class Main { public static void main(String args) throws Exception { // Iniciar el proceso ProcessBuilder builder = new ProcessBuilder().command("cat", "/proc/uptime"); Process process = builder.start(); // Alternativa a ProcessBuilder //Process process = Runtime.getRuntime().exec(new String { "cat", "/proc/uptime" }); // Esperar a que termine el proceso y obtener su valor de salida process.waitFor(10, TimeUnit.SECONDS); int value = process.exitValue(); if (value != 0) { throw new Exception(MessageFormat.format("Código de salida con error (%d)", value)); } // Obtener la salida del proceso BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); String result = br.lines().collect(Collectors.joining("\n")); br.close(); // Obtener el tiempo desde el inicio del sistema String seconds = result.split(" "); System.out.printf("Segundos desde el inicio del sistema: %.2f", new BigDecimal(seconds)); } }

Main.java

1 2 
Segundos desde el inicio del sistema: 3115,77 

Main.out

Executar una ordre de el sistema ens dóna accés a un nou món de possibilitats encara que si podem és millor tenir disponible un API per invocar la funcionalitat que volem en comptes d’una integració més fràgil llegint i escrivint en la sortida, d’error i entrada de l’procés. En el següent article basant-me és això comentaré com enviar un correu electrònic a Java signat digitalment amb GPG, aplicant això mateix podem obtenir el país i ciutat sobre la base de l’adreça IP en una aplicació web.

Terminal

el codi font complet de l’exemple pots descarregar-lo de repositori d’exemples de Bloc Bitix allotjat en GitHub i provar-ho en el teu equip executant següent comanda: a ./gradlew run

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *