https://github.com/zeroturnaround/zt-process-killer
ZeroTurnaround Process Killer
https://github.com/zeroturnaround/zt-process-killer
Last synced: 7 months ago
JSON representation
ZeroTurnaround Process Killer
- Host: GitHub
- URL: https://github.com/zeroturnaround/zt-process-killer
- Owner: zeroturnaround
- License: apache-2.0
- Created: 2015-04-16T07:40:04.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2023-12-05T22:08:39.000Z (almost 2 years ago)
- Last Synced: 2025-04-09T15:09:13.356Z (7 months ago)
- Language: Java
- Homepage:
- Size: 289 KB
- Stars: 130
- Watchers: 16
- Forks: 26
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Changelog: Changelog.txt
- License: License.txt
Awesome Lists containing this project
- awesome-java-zh - zt-process-killer - 停止从Java启动的进程或通过PID的系统进程。 (项目 / 流程)
- fucking-awesome-java - zt-process-killer - Stops processes started from Java or the system processes via PID. (Projects / Processes)
- awesome-java - zt-process-killer - Stops processes started from Java or the system processes via PID. (Projects / Processes)
- awesome-java - zt-process-killer - Stops processes started from Java or the system processes via PID. (Projects / Processes)
README
# ZT Process Killer
### Continuous Integration
[](https://travis-ci.org/zeroturnaround/zt-process-killer)
### Quick Overview
The project was created in [ZeroTurnaround](http://zeroturnaround.com/) to have a stable base functionality of stopping running processes from Java.
It can stop processes started from Java (e.g. with [zt-exec](https://github.com/zeroturnaround/zt-exec)) as well as existing system processes based on their process ID (PID).
### Installation
[](https://maven-badges.herokuapp.com/maven-central/org.zeroturnaround/zt-process-killer)
The project artifacts are available in [Maven Central Repository](http://search.maven.org/#browse%7C636943745).
To include it in your maven project then you have to specify the dependency.
```xml
...
org.zeroturnaround
zt-process-killer
1.11
...
```
### Motivation
In Java [Process.destroy()](https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html#destroy--) is ambiguous.
On Windows it terminates processes forcibly. On UNIX it terminates them gracefully.
As invoking **kill** commands from Java is errorprone it should have an advised API and good test coverage.
We had the following functional requirements:
* check whether a process is alive
* wait until a process has finished
* terminate a process gracefully (by default disabled on Windows as it's unsupported - [WindowsProcess](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/WindowsProcess.java))
* terminate a process forcibly
* get the process ID (PID) of running JVM
and these non-functional requirements:
* abstraction of processes regardless they are started from Java or not (use process ID) - [SystemProcess](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/SystemProcess.java)
* have process API similar to [java.lang.Process](https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html)
* all waiting methods should have one version with timeout and another without it
* stopping operation should be idempotent - if a process was already finished it is a success
* separate generic behavior from process implementation - [ProcessUtil](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/ProcessUtil.java)
* support alternative implementations for stopping same process - [OrProcess](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/OrProcess.java)
* simple factory for creating process instances - [Processes](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/Processes.java)
* invoke Java 8 **java.lang.Process** methods if possible - [Java8Process](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/Java8Process.java)
Limitations:
* As the process abstraction is also used for already running processes it can't access their streams or exit value.
* The scope of this project is stopping single processes. However [WindowsProcess](https://github.com/zeroturnaround/zt-process-killer/blob/master/src/main/java/org/zeroturnaround/process/WindowsProcess.java)
has method **setIncludeChildren** to also stop child processes in case the root process is still running.
### Examples
* Get my PID
```java
int pid = PidUtil.getMyPid();
System.out.println("My PID is " + pid);
```
* Check whether a PID is alive
```java
int pid = Integer.parseInt(FileUtils.readFileToString(new File("pidfile")));
PidProcess process = Processes.newPidProcess(pid);
boolean isAlive = process.isAlive();
System.out.println("PID " + pid + " is alive: " + isAlive);
```
* Check whether a process is alive
```java
Process p = new ProcessBuilder("my-application").start();
JavaProcess process = Processes.newJavaProcess(p);
boolean isAlive = process.isAlive();
System.out.println("Process " + process + " is alive: " + isAlive);
```
* Wait until an already started process has finished
```java
int pid = Integer.parseInt(FileUtils.readFileToString(new File("pidfile")));
PidProcess process = Processes.newPidProcess(pid);
boolean finished = process.waitFor(10, TimeUnit.MINUTES);
System.out.println("PID " + pid + " finished on time: " + finished);
```
* Wait until the started process has finished
```java
Process p = new ProcessBuilder("my-application").start();
JavaProcess process = Processes.newJavaProcess(p);
boolean finished = process.waitFor(10, TimeUnit.MINUTES);
System.out.println("Process " + process + " finished on time: " + finished);
```
* Stop an already started process, timeout of 30 seconds for graceful stop, timeout of 10 seconds for forceful stop
```java
int pid = Integer.parseInt(FileUtils.readFileToString(new File("pidfile")));
PidProcess process = Processes.newPidProcess(pid);
ProcessUtil.destroyGracefullyOrForcefullyAndWait(process, 30, TimeUnit.SECONDS, 10, TimeUnit.SECONDS);
```
* Stop the started process, timeout of 30 seconds for graceful stop, timeout of 10 seconds for forceful stop
```java
Process p = new ProcessBuilder("my-application").start();
SystemProcess process = Processes.newStandardProcess(p);
ProcessUtil.destroyGracefullyOrForcefullyAndWait(process, 30, TimeUnit.SECONDS, 10, TimeUnit.SECONDS);
```