Jenkins插件开发,ProcStarter:如何写入已运行进程的stdin

mbyulnm0  于 2023-11-17  发布在  Jenkins
关注(0)|答案(1)|浏览(176)

我正在尝试写入已启动进程的stdin,该进程已经在运行。在进程启动时写入sdtin可以工作:

  • 外部脚本1.sh:*
  1. #!/bin/sh
  2. echo "Started at $(date)"
  3. read a
  4. echo "$(date): got '$a'"

字符串

  • 插件代码:*
  1. ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
  2. ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
  3. proc.stdin(res).join();

  • 在jenkins控制台中输出,与开始时间相同的时间戳并写入sdtin:*
  1. $ /tmp/1.sh
  2. Started at Thu Apr 2 10:52:02 CEST 2020
  3. Thu Apr 2 10:52:02 CEST 2020: got 'hellooo'


我不想在开始时写入sdtin,而是在x秒后,类似于下面的伪代码:

  1. ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
  2. proc.join(); //blocks
  3. //somewhere in another Thread:
  4. Thread.sleep(15000);//pseudocode ;-)
  5. ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
  6. proc.stdin(res); // doesn't work


使用哈德逊.Launcher.ProcStarter是必要的,因为要在Jenkins代理上执行。有没有什么想法,我如何才能写入已经运行的进程的stdin?

xeufq47z

xeufq47z1#

我得到了解决方案,重要的是调用proc.writeStdin()方法,它反转了I/O方向:

  1. ProcStarter procStarter = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
  2. proc.writeStdin();//important ==> Indicates that the caller will directly write to the child process stdin()
  3. Proc myProc = procStarter.start();
  4. myProc.getStdin().write(("helloooo2" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
  5. myProc.getStdin().flush();

字符串

相关问题