Como executar un proceso de sistema con Java

Java

Linux

Java por si só inclúe unha ampla colección de clases coas principais funcionalidades que podemos necesar, se non o ofrece Na API é moi posible que haxa unha biblioteca que a proporcione. Pero nalgún momento, quizais recibamos o caso de que un comando de comandos devolva a información ou realice a acción que necesitamos. Pode ser un comando do sistema GNU / Linux, Windows ou Mac OS X ou un guión en Java, Python, Ruby ou outro idioma de programación. A través do proceso e clase de processbuilder é posible para nós lanzar un proceso de calquera comando de comandos e acceder á súa entrada estándar, saída estándar e saída de erro.

A clase de proceso representa o proceso que lanzamos, temos dous Formas de obter unha referencia Esta clase, unha con Runtime.getInstance (). Exec () e outra coa clase de processbuilder con ambos será posible establecer variables de ambiente, o directorio de traballo ou redireccionar a entrada e saír. Obtivo referencia a unha instancia de proceso co método GetInputStream () Leremos a saída estándar do proceso, con GetErrorInputstream () a saída de erro e con GeToutputsterstream () Podemos enviar contido á entrada estándar. Outros métodos de utilidade permitiranos saber se o proceso aínda está vivo con isalive (), obtén o código de saída con ExitValue (), agarde que termine con espera (). Finalmente con destruír () podemos terminar abruptamente o proceso.

Non son da notable noticia de Java 8 pero a partir desta versión pode establecer unha espera máxima para a rescisión do proceso, as variables de ambiente e O directorio de traballo. E máis pequenos cambios, pero moi útil, xa que estes serán engadidos a outras clases da API.

Isto é posible facer calquera cousa que o sistema poida facer de acordo cos comandos que instalaron ou poidan instalarse e Isto significa que está ao alcance de Java nun sistema GNU / Linux o poder da súa liña de comandos. Por exemplo, supoñamos que queremos saber nun programa Java o tempo que se iniciou un sistema que sería útil se queremos implementar algún tipo de métricas de monitorización co actuador de arranque de primavera. Java non ten un método que proporcione esta información na súa API, con todo, en GNU / Linux podemos coñecer estes datos usando o sistema de ficheiros virtual accesibles en / proc, específicamente no ficheiro / proc / hora de actividade. Este ficheiro contén dous números o primeiro é o que nos interesaría sendo o número de segundos desde que comezou o sistema e o segundo o tempo que permaneceu en repouso. O segundo número nun sistema con procesador con varios núcleos físicos ou lóxicos é probable que sexa superior ao primeiro.

1 2 
$ cat /proc/uptime 1488.79 5666.60 

UpTime.Sh

Este sería o programa Java para saber canto tempo comezou un sistema GNU / Linux. En primeiro lugar, o proceso créase, espérase que finalice e obtense o seu código de saída, obtense a saída do proceso (entrada para o programa), o resultado é procesado e os segundos que comezou o sistema.

 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 un comando de comando dános acceso a un novo mundo de posibilidades aínda que se podemos mellor ter unha API dispoñible para invocar a funcionalidade que queremos en lugar dunha lectura máis fráxil de integración e escribindo na saída, erro e entrada do proceso .. No seguinte artigo baseado en isto é que comentarei sobre como enviar un correo electrónico en Java asinado dixitalmente con GPG, aplicando este mesmo podemos obter o país e a cidade con base na dirección IP nunha aplicación web.

Terminal

O código fonte de orixe completo pode descargalo desde o repositorio de Blog Bitix aloxado en GitHub e probalo no seu computador executando o seguinte comando:
./gradlew run

Deixa unha resposta

O teu enderezo electrónico non se publicará Os campos obrigatorios están marcados con *