Yürütülebilir dosyanın adını bildiğim çalışan bir Win işlemi bulmak için Java yöntemine ihtiyacım var. Şu anda çalışıp çalışmadığını görmek istiyorum ve bulursam işlemi öldürmek için bir yola ihtiyacım var.
Komut satırı pencereleri araçlarını tasklist
ve taskkill
kullanabilirsiniz ve onları Runtime.exec()
kullanarak Java'dan çağırabilirsiniz.
private static final String TASKLIST = "tasklist";
private static final String KILL = "taskkill /F /IM ";
public static boolean isProcessRunning(String serviceName) throws Exception {
Process p = Runtime.getRuntime().exec(TASKLIST);
BufferedReader reader = new BufferedReader(new InputStreamReader(
p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
if (line.contains(serviceName)) {
return true;
}
}
return false;
}
public static void killProcess(String serviceName) throws Exception {
Runtime.getRuntime().exec(KILL + serviceName);
}
ÖRNEK:
public static void main(String args[]) throws Exception {
String processName = "WINWORD.EXE";
//System.out.print(isProcessRunning(processName));
if (isProcessRunning(processName)) {
killProcess(processName);
}
}
İstenilen işlevselliği sağlayan küçük bir API var:
https://github.com/kohsuke/winp
Windows İşlem Kitaplığı
SysInternals PsKill ve SysInternals PsList gibi işlemleri öldürmek için bir komut satırı aracı kullanabilirsiniz.
Ayrıca build-in tasklist.exe ve taskkill.exe'yi de kullanabilirsiniz, ancak bunlar yalnızca Windows XP Professional ve sonraki sürümlerinde bulunur (Home Edition'da değil).
Programı çalıştırmak için Java.lang.Runtime.exec kullanın.
İşte bunu yapmanın harika bir yolu:
final Process jpsProcess = "cmd /c jps".execute()
final BufferedReader reader = new BufferedReader(new InputStreamReader(jpsProcess.getInputStream()));
def jarFileName = "FileName.jar"
def processId = null
reader.eachLine {
if (it.contains(jarFileName)) {
def args = it.split(" ")
if (processId != null) {
throw new IllegalStateException("Multiple processes found executing ${jarFileName} ids: ${processId} and ${args[0]}")
} else {
processId = args[0]
}
}
}
if (processId != null) {
def killCommand = "cmd /c TASKKILL /F /PID ${processId}"
def killProcess = killCommand.execute()
def stdout = new StringBuilder()
def stderr = new StringBuilder()
killProcess.consumeProcessOutput(stdout, stderr)
println(killCommand)
def errorOutput = stderr.toString()
if (!errorOutput.empty) {
println(errorOutput)
}
def stdOutput = stdout.toString()
if (!stdOutput.empty) {
println(stdOutput)
}
killProcess.waitFor()
} else {
System.err.println("Could not find process for jar ${jarFileName}")
}
Windows işlemini öldürmek için aşağıdaki sınıfı kullanın ( çalışıyorsa ). /F
argümanı tarafından belirtilen işlemin sonlandırılacağından emin olmak için force komut satırı değişkenini /IM
kullanıyorum.
import Java.io.BufferedReader;
import Java.io.InputStreamReader;
public class WindowsProcess
{
private String processName;
public WindowsProcess(String processName)
{
this.processName = processName;
}
public void kill() throws Exception
{
if (isRunning())
{
getRuntime().exec("taskkill /F /IM " + processName);
}
}
private boolean isRunning() throws Exception
{
Process listTasksProcess = getRuntime().exec("tasklist");
BufferedReader tasksListReader = new BufferedReader(
new InputStreamReader(listTasksProcess.getInputStream()));
String tasksLine;
while ((tasksLine = tasksListReader.readLine()) != null)
{
if (tasksLine.contains(processName))
{
return true;
}
}
return false;
}
private Runtime getRuntime()
{
return Runtime.getRuntime();
}
}
süper kakes tarafından yazılmış cevap küçük bir değişiklik
private static final String KILL = "taskkill /IMF ";
.. olarak değiştirildi.
private static final String KILL = "taskkill /IM ";
/IMF
seçeneği çalışmıyor. notepad öldürmez .. bu arada /IM
seçeneği aslında işe yarıyor
Bazı yerel kodları çağırmanız gerekecektir, çünkü IMHO bunu yapan kütüphane yoktur. JNI hantal ve zor olduğu için JNA'yı (Java Native Access) kullanmayı deneyebilirsiniz. https://jna.dev.Java.net/