(Flutter/Dart)如何在Process.start后杀死进程

zbwhf8kr  于 2023-05-29  发布在  Flutter
关注(0)|答案(1)|浏览(405)

我有一个Future函数:

Future<Process> executeCommand(List<String> args) async {
  var process = await Process.start('java', args, workingDirectory: folder);
  return process;
}

process = await ref.read(searchControllerProvider).executeCommand(cmd);
await stdout.addStream(process.stdout);

它应该执行一个命令来运行一个jar文件。如何添加按钮在进程结束前终止该进程?Process.killPid(process.pid)process.kill()都不工作。killPid在我第一次单击按钮时返回true,但它仍在运行。

gtlvzcf8

gtlvzcf81#

这更像是一个jar的问题,而不是 dart /Flutter的问题。Dart在process.pid中给出的pid不是jar文件使用的正确的pid
最后我运行了Java的jps命令,并在输出中循环搜索正确的pid。

String javaBinPath = '${Platform.environment['JAVA_HOME']}\\bin';
var jps = Process.runSync('jps', [], workingDirectory: javaBinPath, runInShell: true);
for (var line in LineSplitter.split(jps.stdout)) {
  List<String> parts = line.split(' ');
  int pid = int.parse(parts[0]);
  String name = parts[1];
  if (name == 'x.jar') {
    Process.killPid(pid);
    break;
  }
}

这是一个丑陋的解决方案,但它有效。

相关问题