如何在一小时后杀死特定的java文件,而不知道它的具体PID?

时间:2016-08-27 23:29:13

标签: java windows batch-file

目前我的批处理文件将启动20个带有不同参数的jar,一小时后,taskkill命令会杀死所有java,批处理文件现在将启动20个不同的jar。

我的问题是,启动时的max cpu使用率,以及之后可能浪费的cpu。我可以在不同的时间启动jar文件,但是它们将不会运行相同的时间。 CPU使用时间最多为5分钟。

我需要启动一个jar文件,然后在一小时内将其杀死,而不会触及其他19个jar文件,并且不知道PID。

我一直在浏览网页,我看到了一些关于它的内容,将其作为后台进程,然后以这种方式获得PID,有人可以帮我解决这个问题吗?

这就是现在的样子

UILabel

3 个答案:

答案 0 :(得分:1)

使用jps.exe实用程序(它是标准JDK的一部分)来学习刚刚启动的Java进程的PID。然后使用taskkill / pid来杀死这一个进程。

答案 1 :(得分:0)

我在这里会有一些乐趣:)

如果您没有罐子的所有权,可以尝试以下方式:

public class KillTask extends TimerTask {

    private Process process;

    public KillTask(Process process) {
        this.process = process;
    }

    @Override
    public void run() {
        // Prepare to die!
        process.destroy();
    }
}

public class KillDriver {

    public KillDriver(String command) {
        try {
            Process process = Runtime.getRuntime().exec(command);
            new Timer().schedule(new KillTask(process), 60 * 60 * 1000);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        for (String s : args)
            new KillDriver(s);
    }
}

此示例假定将启动多个jar,但您可以将其更改为单个或可能传递延迟作为参数以增加一些灵活性。

答案 2 :(得分:0)

看来你给了Jars他们自己的进程名称("第一","第二","第三"),所以我假设你可以使用像这样的VBscript不需要PID来杀死它。

ProcessName = "FIRST"

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate,authenticationLevel=pktPrivacy,(Debug)}!\\.\root\cimv2")

Set colProcessList = objWMIService.ExecQuery("Select * From Win32_Process")
  For Each objProcess in colProcessList
    If InStr(UCase(objProcess.Name), ProcessName) Then
      WScript.Echo "Killing " & objProcess.Name
      objProcess.Terminate()
    End If
  Next