ZeroTurnaround Process Killer

Overview

ZT Process Killer

Continuous Integration

Build Status

Quick Overview

The project was created in ZeroTurnaround to have a stable base functionality of stopping running processes from Java. It can stop processes started from Java (e.g. with zt-exec) as well as existing system processes based on their process ID (PID).

Installation

Maven Central

The project artifacts are available in Maven Central Repository.

To include it in your maven project then you have to specify the dependency.

...
<dependency>
    <groupId>org.zeroturnaround</groupId>
    <artifactId>zt-process-killer</artifactId>
    <version>1.10</version>
</dependency>
...

Motivation

In Java Process.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)
  • 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
  • have process API similar to java.lang.Process
  • 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
  • support alternative implementations for stopping same process - OrProcess
  • simple factory for creating process instances - Processes
  • invoke Java 8 java.lang.Process methods if possible - Java8Process

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 has method setIncludeChildren to also stop child processes in case the root process is still running.

Examples

  • Get my PID
int pid = PidUtil.getMyPid();
System.out.println("My PID is " + pid);

  • Check whether a PID is alive
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
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
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
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
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
Process p = new ProcessBuilder("my-application").start();
SystemProcess process = Processes.newStandardProcess(p);
ProcessUtil.destroyGracefullyOrForcefullyAndWait(process, 30, TimeUnit.SECONDS, 10, TimeUnit.SECONDS);
Comments
  • Document use-case for `isAlive`

    Document use-case for `isAlive`

    Hey guys,

    I'm wrapping your work for kotlin in koxlinx.exec, and I'm really not sure what the isAlive polling method is useful for.

    Can java's own Process become a 'zombie' in the sense that it somehow still exists and waitFor isn't returning even though the process doesn't exist anymore? Does it infact discover processes that do exist but are permanently in some non-running state I'm not familiar with?

    Can you add something to the documentation to describe when you might want to use isAlive, and how?

    Cheers 🍻

    opened by Groostav 2
  • Shortcircuit after first invokeDestroy in org.zeroturnaround.process.OrProcess destroy

    Shortcircuit after first invokeDestroy in org.zeroturnaround.process.OrProcess destroy

    Is the for-loop supposed to short-circuit after the first invokeDestroy()? Or is it supposed to invoke destroy on all the children?

    Just wondering how that works.

    @Override public void destroy(boolean forceful) throws IOException, InterruptedException { for (SystemProcess child : children) { try { invokeDestroy(child, forceful); return; } catch (UnsupportedOperationException e) { // continue } } throw new UnsupportedOperationException(); }

    opened by ghost 2
  • Exception while trying to obtain process id from Windows 7

    Exception while trying to obtain process id from Windows 7

    I was writing a program to invoke a process and return the PID using PIDUtils. But when I tried to obtain the PID I received the below exception

    Caused by: java.lang.NoClassDefFoundError: org/zeroturnaround/process/win/Kernel32 at org.zeroturnaround.process.PidUtil.getPidfromHandle(PidUtil.java:145) at org.zeroturnaround.process.PidUtil.getPidfromWin32Process(PidUtil.java:135) at org.zeroturnaround.process.PidUtil.doGetPid(PidUtil.java:102) at org.zeroturnaround.process.PidUtil.getPid(PidUtil.java:90) at org.me.processexecutor.ProcessInvoker.call(MNXZeroTurnaround.java:53) at org.me.processexecutor.ProcessInvoker.call(MNXZeroTurnaround.java:1) at java.util.concurrent.FutureTask.run(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

    opened by vijaygopal 1
  • killing a Windows process gracefully throws UnsupportedOperationException

    killing a Windows process gracefully throws UnsupportedOperationException

    From the doc I can see "terminate a process gracefully (by default disabled on Windows as it's unsupported - WindowsProcess)". How do I get a running java process as a WindowsProcess and how can I set the gracefulDestroyEnabled = true so that the windows process is terminated gracefully?

    opened by arunarnim 1
  • Friendly upgrade request for the latest JNA library

    Friendly upgrade request for the latest JNA library

    While trying to use the using GetProcessId in the Kernel32 implementation an AccessViolation was caused, which seems not to happened in all situations, and I have not been able to find a pattern in when this issue occurs.

    However it seemed to help to upgrade to the latest version of the JNA i.e. net.java.dev.jna:jna:4.2.2 from the version com.sun.jna:jna:3.0.9, which is currently used.

    As the 3.0.9 version seems rather old... perhaps it would be an idea to upgrade to a newer version of the library.

    Thanks in advance

    Meang

    opened by mat013 1
  • Added OSGi metadata support

    Added OSGi metadata support

    Currently the library can't be used in OSGi environments because there is no OSGi metadata available. With this pull request the maven build is modified that the resulting jar file contains all necessary OSGi metadata in the META-INF/MANIFEST.MF file.

    I also recommend an upgrade of the JNA library to at least >=5.0.0 because the OSGi metadata of dependent libraries is important too (not mandatory). JNA 4.2.2 (current version) has OSGi metadata but it's mediocre, since 5.0.0 is got much better.

    opened by swimmesberger 0
  • Use system calls instead of spawning commands to control processes on unix

    Use system calls instead of spawning commands to control processes on unix

    Some very restricted unix environments don't even have the kill command on the user's PATH, which breaks this lib.

    Plus there's no reason not to use system calls instead of spawning the kill command.

    opened by lorban 0
  • Fixed finding WMIC.exe on machines where the SYSTEMROOT env variable has different cases

    Fixed finding WMIC.exe on machines where the SYSTEMROOT env variable has different cases

    On some machines the environment variable is "SystemRoot" on others it is "SYSTEMROOT". To be safe lets do a case insensitive search for the variable.

    opened by taivokasper 0
  • Add WindowsProcess.isAlive() implmentation using tasklist instead of wmic

    Add WindowsProcess.isAlive() implmentation using tasklist instead of wmic

    Moved the issue here from https://github.com/zeroturnaround/zt-exec/issues/28

    reinra commented on Aug 28, 2015

    Sometimes the wmic.exe may be missing from the system.

    iirekm commented on Mar 3, 2016

    I'm not sure if even tasklist.exe is present on all editions of Windows. It's hard to find exact information about that, but from my experience, even basic commands may be missing in older or Home / Basic editions of Windows.

    I think the better way is to use Windows API, through JNA library for example. MSDN docs say exactly since which Windows version which function is available, and there's no need to sprawn a separate process just to check status of some other process.

    opened by reinra 0
  • Windows WMIC deprecated in Windows 10 21H1

    Windows WMIC deprecated in Windows 10 21H1

    The WMI command-line tool (WMIC) is deprecated since Windows 10 21H1 as could be seen here:

    https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmic deprecation notice

    and also here: https://docs.microsoft.com/en-us/windows/deployment/planning/windows-10-deprecated-features

    There is an associated issue that is could be relevant now to replace WMIC: https://github.com/zeroturnaround/zt-process-killer/issues/11 It seems some effort was done by @reinra on the multiModule branch but it is quite outdated.

    Does it make sense to use ProcessHandle (available since 9) now that Java 11 and newer versions are much more widespread?

    opened by mdaloia 0
  • Bump logback-classic from 1.1.1 to 1.2.0

    Bump logback-classic from 1.1.1 to 1.2.0

    Bumps logback-classic from 1.1.1 to 1.2.0.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump commons-io from 2.2 to 2.7

    Bump commons-io from 2.2 to 2.7

    Bumps commons-io from 2.2 to 2.7.

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • need to bump to latest jna and zt-exec

    need to bump to latest jna and zt-exec

    issues on win2016 server after latest patches:

    java.lang.UnsatisfiedLinkError: C:\Users\Administrator\AppData\Local\Temp\jna-146731693\jna5340145331185949059.dll: Can't find dependent librariesat java.lang.ClassLoader$NativeLibrary.load(Native Method) ~[?:1.8.0_265]at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934) ~[?:1.8.0_265]at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1817) ~[?:1.8.0_265]at java.lang.Runtime.load0(Runtime.java:810) ~[?:1.8.0_265]at java.lang.System.load(System.java:1088) ~[?:1.8.0_265]at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:851) ~[lucidworks-agent.jar:?]at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:826) ~[lucidworks-agent.jar:?]at com.sun.jna.Native.<clinit>(Native.java:140) ~[lucidworks-agent.jar:?]at com.sun.jna.Pointer.<clinit>(Pointer.java:41) ~[lucidworks-agent.jar:?]at com.sun.jna.PointerType.<init>(PointerType.java:25) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.win.W32API$HANDLE.<init>(W32API.java:49) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.win.W32API$3.<init>(W32API.java:59) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.win.W32API.<clinit>(W32API.java:59) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.win.Kernel32.<clinit>(Kernel32.java:5) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.PidUtil.getPidFromHandle(PidUtil.java:156) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.PidUtil.getPidFromWin32Process(PidUtil.java:146) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.PidUtil.doGetPid(PidUtil.java:113) ~[lucidworks-agent.jar:?]at org.zeroturnaround.process.PidUtil.getPid(PidUtil.java:97) ~[lucidworks-agent.jar:?]
    
    opened by nddipiazza 1
  • Bump junit from 4.11 to 4.13.1

    Bump junit from 4.11 to 4.13.1

    Bumps junit from 4.11 to 4.13.1.

    Release notes

    Sourced from junit's releases.

    JUnit 4.13.1

    Please refer to the release notes for details.

    JUnit 4.13

    Please refer to the release notes for details.

    JUnit 4.13 RC 2

    Please refer to the release notes for details.

    JUnit 4.13 RC 1

    Please refer to the release notes for details.

    JUnit 4.13 Beta 3

    Please refer to the release notes for details.

    JUnit 4.13 Beta 2

    Please refer to the release notes for details.

    JUnit 4.13 Beta 1

    Please refer to the release notes for details.

    JUnit 4.12

    Please refer to the release notes for details.

    JUnit 4.12 Beta 3

    Please refer to the release notes for details.

    JUnit 4.12 Beta 2

    No release notes provided.

    JUnit 4.12 Beta 1

    No release notes provided.

    Commits
    • 1b683f4 [maven-release-plugin] prepare release r4.13.1
    • ce6ce3a Draft 4.13.1 release notes
    • c29dd82 Change version to 4.13.1-SNAPSHOT
    • 1d17486 Add a link to assertThrows in exception testing
    • 543905d Use separate line for annotation in Javadoc
    • 510e906 Add sub headlines to class Javadoc
    • 610155b Merge pull request from GHSA-269g-pwp5-87pp
    • b6cfd1e Explicitly wrap float parameter for consistency (#1671)
    • a5d205c Fix GitHub link in FAQ (#1672)
    • 3a5c6b4 Deprecated since jdk9 replacing constructor instance of Double and Float (#1660)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Add support for Java 12/13

    Add support for Java 12/13

    On OpenJDK 12/13 I see this:

    Exception in thread "main" java.lang.IllegalStateException: Could not detect PID form Process[pid=26, exitValue="not exited"]
    	at org.zeroturnaround.process.PidUtil.doGetPid(PidUtil.java:117)
    	at org.zeroturnaround.process.PidUtil.getPid(PidUtil.java:97)
    Caused by: java.lang.NoSuchFieldException: handle
    	at java.base/java.lang.Class.getDeclaredField(Class.java:2417)
    	at org.zeroturnaround.process.PidUtil.getHandle(PidUtil.java:150)
    	at org.zeroturnaround.process.PidUtil.getPidFromWin32Process(PidUtil.java:146)
    	at org.zeroturnaround.process.PidUtil.doGetPid(PidUtil.java:113)
    	... 4 more
    
    opened by theangrydev 4
Owner
ZeroTurnaround
Our products help Java teams improve productivity & efficiency – resulting in better code, happy devs, and more reliable releases.
ZeroTurnaround
Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards.

Kyrestia Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards. It is not only lightwe

Weiran Wu 32 Feb 22, 2022
A Spring Boot Camel boilerplate that aims to consume events from Apache Kafka, process it and send to a PostgreSQL database.

SPRING-BOOT CAMEL BOILERPLATE This is a Spring-Boot Camel Application model that you can use as a reference to study or even to use in your company. I

Bruno Delgado 45 Apr 4, 2022
A compact and highly efficient workflow and Business Process Management (BPM) platform for developers, system admins and business users.

Flowable (V6) Maven Central: Docker Images: License: Homepage: https://www.flowable.org/ flowable / flowəb(ə)l / a compact and highly efficient workfl

Flowable 6k Jan 7, 2023
Squadio-App is a Users-Accounts financial system. exposes Rest APIs with JWT authentication/Authorization process .

squadio-app Description Squadio-App is a Users-Accounts financial system. exposes Rest APIs with JWT authentication/Authorization process . How to Run

Bashar Othman 1 Jan 29, 2022
Deploys an agent to fix CVE-2021-44228 (Log4j RCE vulnerability) in a running JVM process

-- This repository has been archived -- Further development of this tool will continue at corretto/hotpatch-for-apache-log4j2. Thanks for sharing, com

Volker Simonis 108 Dec 23, 2021
Reindex - application for visualize, optimize and automate your Elasticsearch reindex process

Welcome to reindex application for Elasticsearch This application will help you to reindex one or more existing indices, into the local or remote Elas

DBeast 3 Jan 2, 2023
Quarkus extension for launching an in-process Wiremock server

Quarkus extension for running Wiremock in DEVELOPMENT mode This extension is currently not published in any maven repository. If you want to test this

Quarkiverse Hub 5 Dec 30, 2022
ZeroTurnaround Process Executor

ZT Process Executor Continuous Integration Quick Overview The project was created to merge similar functionality of projects at ZeroTurnaround into a

ZeroTurnaround 817 Dec 29, 2022
JavaWeb MemoryShell Inject/Scan/Killer/Protect Research & Exploring

Memory Shell JavaWeb MemoryShell Inject/Scan/Killer/Protect Research & Exploring 文章:JavaWeb 内存马一周目通关攻略 项目介绍 本项目用来学习和研究 JavaWeb 内存马添加和防御模式,共包含以下几个模块。 m

素十八 345 Dec 30, 2022
Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards.

Kyrestia Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards. It is not only lightwe

Weiran Wu 32 Feb 22, 2022
Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.

Ribbon Ribbon is a client side IPC library that is battle-tested in cloud. It provides the following features Load balancing Fault tolerance Multiple

Netflix, Inc. 4.4k Jan 1, 2023
Logstash - transport and process your logs, events, or other data

Logstash Logstash is part of the Elastic Stack along with Beats, Elasticsearch and Kibana. Logstash is a server-side data processing pipeline that ing

elastic 13.2k Jan 5, 2023
Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.

Ribbon Ribbon is a client side IPC library that is battle-tested in cloud. It provides the following features Load balancing Fault tolerance Multiple

Netflix, Inc. 4.4k Jan 4, 2023
a Business Process Management (BPM) Suite

Quick Links Homepage: http://jbpm.org/ Business Applications: https://start.jbpm.org/ Documentation: https://docs.jboss.org/jbpm/release/latestFinal/j

KIE (Drools, OptaPlanner and jBPM) 1.4k Jan 2, 2023
Low-overhead, non-blocking I/O, external Process implementation for Java

NuProcess NuProcess is proud to power Facebook's Buck build. A low-overhead, non-blocking I/O, external Process execution implementation for Java. It

Brett Wooldridge 644 Dec 29, 2022
Sends stacktrace-level performance data from a JVM process to Riemann.

Riemann JVM Profiler riemann-jvm-profiler is a JVM agent that you can inject into any JVM process--one written in Clojure, Java, Scala, Groovy, etc.--

Riemann 288 Sep 21, 2022
A Spring Boot Camel boilerplate that aims to consume events from Apache Kafka, process it and send to a PostgreSQL database.

SPRING-BOOT CAMEL BOILERPLATE This is a Spring-Boot Camel Application model that you can use as a reference to study or even to use in your company. I

Bruno Delgado 45 Apr 4, 2022
Flutter plugin to listen to the process text intent stream.

Flutter Process Text Plugin Show some ❤️ and ⭐ the repo Why use Flutter Process Text? Flutter Process Text Plugin is known for : Flutter Process Text

Divyanshu Shekhar 14 Jul 1, 2022