I have this so far:
public static void main(String[] args) {
try {
String line;
Process p = Runtime.getRuntime().exec(
System.getenv("windir") + "\\system32\\" + "tasklist.exe");
BufferedReader input = new BufferedReader(new InputStreamReader(
p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line); // <-- Parse data here.
}
input.close();
} catch (Exception err) {
err.printStackTrace();
}
Scanner killer = new Scanner(System.in);
int tokill;
System.out.println("Enter PID to be killed: ");
tokill = killer.nextInt();
}
}
I want to be able to kill a process based on the PID a user enters. How can I do this? (Only needs to work on Windows). *NB: Must be able to kill any process, inc. SYSTEM processes, so I'm guessing a -F flag will be needed if using taskkill.exe to do this?
So if I had
Runtime.getRuntime().exec("taskkill /F /PID 827");
how can I replace "827" with my tokill variable?
Simply build the string to kill the process:
String cmd = "taskkill /F /PID " + tokill;
Runtime.getRuntime().exec(cmd);
I don't sit in front of a Windows computer right now. But if tasklist
works for you, you can use ProcessBuilder in order to run the windows command taskkill . Call taskkill
like this with a ProcessBuilder
instance cmd /c taskkill /pid %pid%
(replace %pid% with the actual pid). You don't need the absolute path to both executables because c:/windows/system32
is in the path variable.
As Eric (in a comment to your question) pointed out there are many who had this answer before.
String cmd = "taskkill /F /T /PID " + tokill;
Runtime.getRuntime().exec(cmd);
Use taskkill if you are on Windows.
You may want to use the /T option to kill all spawned child processes.
The JavaSysMon library does the trick and has the benefit of being multi-platform: https://github.com/danielflower/javasysmon (fork of the original, this one has a handy maven artifact)
private static final JavaSysMon SYS_MON = new JavaSysMon();
// There is no way to transform a [Process] instance to a PID in Java 8.
// The sysmon library does let you iterate over the process table.
// Make the filter match some identifiable part of your process and it should be a good workaround
int pid = Arrays.stream(SYS_MON.processTable())
.filter(p -> p.getName().contains("python"))
.findFirst().get().getPid()
// Kill the process
SYS_MON.killProcess(pid);
// Kill the process and its children, or only the children
SYS_MON.killProcessTree(pid, descendentsOnly);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.