Process etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Process etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

24 Ağustos 2021 Salı

Process Sınıfı

Giriş
Şu satırı dahil deriz
import java.lang.Process;
getInputStream metodu
Örnek
Şöyle yaparız
boolean executeOpenSslCmdProcess(String host) {

  StringBuffer command = new StringBuffer();
  command.append("openssl x509 -req -in /tmp/ppserver.csr -out /tmp/ppserver.crt -sha256 "
  +
" -CA /tmp/powerpath-CA.crt -CAkey /tmp/powerpath-CA.key -CAcreateserial -days 821"
); String[] cmd = { "/bin/sh", "-c", command.toString() }; try { Process process = Runtime.getRuntime().exec(cmd); InputStream inputStream = process.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, CHAR_SET)); String result = br.lines().collect(Collectors.joining(System.lineSeparator())); exitCode = process.waitFor(); logger.info("ExitCode : {} ", exitCode); if (exitCode != 0) { return false; } } catch (IOException | InterruptedException ex) { logger.info("IOException - " + ex); return false; } }
pid metodu
Eskiden şöyle yapardık
static String processPid(Process process) {
  try {
    return Process.class.getMethod("pid").invoke(process).toString();
  } catch (Exception e) {
    return process.toString().replaceFirst("^.*pid=(\\d+).*$", "$1");
  }
}
Şimdi şöyle yapıyoruz
String processPid(Process process) {
  try {
    return String.valueOf(process.pid());
  } catch (Exception e) {
    return process.toString().replaceFirst("^.*pid=(\\d+).*$", "$1");
  }
}


13 Haziran 2019 Perşembe

Runtime Sınıfı

Giriş
Runtime sınıfı erişilebilir bir constructor vermiyor. getInstance () çağrısı ile nesneyi yaratıyoruz.

addShutdownHook metodu
Açıklaması şöyle. Ctrl + C ile uygulamayı kapatmak içindir. Bu metod içinde System.out.println() yapılabilir.
The Java virtual machine shuts down in response to two kinds of events:
  • The program exits normally, when the last non-daemon thread exits or when the exit (equivalently, System.exit) method is invoked, or
  • The virtual machine is terminated in response to a user interrupt, such as typing Ctrl+C or a system-wide event, such as user logoff or system shutdown.
- Ctrl +C Linux'ta SIGINT sinyali gönderir.
- Ancak Windows'ta java -jar ile başlatılan uygulamayı konsol penceresinden kapatınca CTRL-CLOSE 
gönderilir. addShutdownHook metodu bu sinyali yakalamaz. Bir çözüm burada.

Örnek
Şöyle yaparız.
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
  ...
  executorPool.shutdown();
  logger.info("Shutdown executorPool");
}));
availableProcessors metodu
Şöyle yaparız.
Runtime.getRuntime().availableProcessors();
exec metodu
Java kullanarak bir başka uygulamayı çalıştırmak için Runtime.exec() veya ProcessBuilder sınıfını kullanmak lazım. Her iki sınıf ta Process nesnesi ürettiği için geri kalan işlemler aslında hemen hemen aynı.

Runtime.exec() hata olursa exception atmaz. Process.exitValue() veya Process.getInputStream() metodları ile hatayı anlamak mümkün olabilir.

exec metodu - string
Örnek
ps komutu çalıştırmak için şöyle yaparız.
Process process = Runtime.getRuntime().exec("ps x");
Örnek - komut satırı
Şöyle yaparız.
Runtime run = Runtime.getRuntime();
Process pr = run.exec("cmd /c del /s/q c:\\mydirectory");
pr.waitFor();
Örnek - bat dosyası
Bat Dosyası Çalıştırma yazısına taşıdım.

exec metodu - string [] 

Örnek - array
Şöyle yaparız.
String[] cmd = ...;
Process p = Runtime.getRuntime().exec(cmd);
Örnek - pipe 
Şöyle yaparız.
String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);
exec - command + environment + working directory
Metodun imzası şöyle
exec(String[] cmdarray, String[] envp, File dir)
Üçüncü parametre uygulamanın "working directory" dizinini belirtir. Eğer null verilirse yeni uygulama kendisini yaratan uygulamanın "working directory" alanını kullanılır. 

Bat dosyasına "working directory" vermek için şöyle yaparız.
Runtime.exec("C:\mydir\myfile.bat", null, new File("C:\mydir"));
freeMemory metodu
Şöyle yaparız.
Runtime.getRuntime().freeMemory();
maxMemory metodu
Şöyle yaparız.
Runtime.getRuntime().maxMemory();
totalMemory metodu
Şöyle yaparız.
Runtime.getRuntime().totalMemory();

22 Mayıs 2019 Çarşamba

ProcessBuilder Sınıfı

Giriş
Java kullanarak bir başka uygulamayı çalıştırmak için Runtime.exec() veya ProcessBuilder sınıfını kullanmak lazım. Her iki sınıf ta Process nesnesi ürettiği için geri kalan işlemler aslında hemen hemen aynı.

Runtime Sınıfından Farkı
Bu sınıfın Runtime.exec()'ten en önemli farkı çalıştırılacak uygulama ve parametrelerini teker teker alması. Runtime.exec() şöyle kullanılır.
String command = "cmd.exe /c \"dir -d\"";
File workingDir = new File("C:\\");
String[] env = {};
Runtime.getRuntime().exec(command, env, workingDir);
Bu sınıf ise aşağıdaki constructor metodlarında görüldüğü gibi tüm parametreleri ayrı ayrı alır. Ayrıca sınıfı fluent kullanılmak üzere tasarlanmış.
Process process = new ProcessBuilder(...)
            .redirectOutput(...)
            .redirectError(...)
            .start();
Redirect
Redirect işlemleri için şu satırı dahil ederiz.
import java.lang.ProcessBuilder.Redirect;
constructor - array
Açıklaması şöyle. Uygulamayı çalıştırmak için gereken tüm parametreleri bir array olarak alır. Parametreleri boşluk ile ayırmaya gerek kalmaz.
The ProcessBuilder takes this list and uses each value contained in it to generate the command. Each value inside the command list is separated with spaces by the ProcessBuilder.
Örnek
Komut satırından çalıştırılan bir uygulamamız olsun.
/usr/local/bin/ticketer/ticketer_robot "test" "testoce" "2 - Medium" 
"/data/mars/logs/tesst.log" "test@test.com"
Aynısını kodla yapmak için şöyle yaparız.
String[] command = {"/bin/bash",
                    "/usr/local/bin/ticketer/ticketer_robot", 
                    "test",
                    "testoce",
                    "2 - Medium",
                    "/data/mars/logs/tesst.log",
                    "test@test.com"
};

ProcessBuilder pb = new ProcessBuilder (command);
constructor - vararg for 
Eğer parametreleri array olarak geçmek istemiyorsak var arg olarak ta geçebiliriz.
Örnek
Linux'ta kabuğu kullanmak için şöyle yaparız. Kabuk ile echo programı sudo uygulamasına şifreyi geçer.
new ProcessBuilder("/bin/sh", "-c", "echo <password> | sudo -S /opt/script.sh");
b.start();
Örnek
Windows'ta kabuğu kullanmak için şöyle yaparız.
new ProcessBuilder ("cmd.exe", "/c",  "dir -d")
command metodu
Default constructor ile kurulan nesneye çalıştırılacak komutu vermek için kullanılır. Şöyle yaparız.
File baseDir = new File("/home/test/work");

Process process = new ProcessBuilder()
            .command("pwd")
            .directory(baseDir)
            .start();
directory metodu
Komutun "working directory" dizinini belirtir.
File workingDir = new File("C:\\");
ProcessBuilder pb = new ProcessBuilder(...);
pb.directory(workingDir);
inheritIO metodu
Açıklaması şöyle. Bu metod yerine redirectInput(), redirectOutput(), redirectError() çağrılarını Redirect.INHERIT parametresi ile teker teker yapmak gerekir.
he subprocess is started with its IO passing up to the process that executed it. This is required to see both any stdouts and stderrs it produces. 
redirectError metodu
Örnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
pb.redirectError (Redirect.INHERIT)
redirectErrorStream metodu
stderr akımını stdout akımına yönlendirir. Şöyle yaparız.
pb.redirectErrorStream (true)
redirectInput metodu
Örnek
start metodu ile uygulamayı başlatmakdan önce şöyle yaparız.
ProcessBuilder builder = new ProcessBuilder(...);
pb.redirectInput(Redirect.PIPE);
Daha sonra start() metodu ile uygulamayı başlatıp girdi sağlarız.
Process process = pb.start();
BufferedWriter stdin = new BufferedWriter(
  new OutputStreamWriter(process.getOutputStream(), StandardCharsets.US_ASCII));
stdin.write("help\n");
stdin.flush();
process.waitFor();
redirectOutput metodu
Örnek
Çalıştırdığımız uygulamanı çıktısını almak için şöyle yaparız.
pb.redirectOutput(Redirect.INHERIT);
start metodu
Process nesnesi döndürür. Şöyle yaparız.
ProcessBuilder pb = new ProcessBuilder(...);
Process process = pb.start();