Jenkins 插件开发,ProcStarter:如何写入已经 运行 个进程的标准输入
Jenkins plugin development, ProcStarter: How to write to stdin of already running process
我正在尝试写入已启动进程的标准输入,它已经是 运行。
在进程启动时写入 sdtin 有效:
外部脚本1.sh:
#!/bin/sh
echo "Started at $(date)"
read a
echo "$(date): got '$a'"
插件中的代码:
ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
proc.stdin(res).join();
jenkins控制台输出,开始时间和写入sdtin的时间戳相同:
$ /tmp/1.sh
Started at Thu Apr 2 10:52:02 CEST 2020
Thu Apr 2 10:52:02 CEST 2020: got 'hellooo'
我不想在开始时写入 sdtin,而是在 x 秒后,类似这样的伪代码:
ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
proc.join(); //blocks
//somewhere in another Thread:
Thread.sleep(15000);//pseudocode ;-)
ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
proc.stdin(res); // doesn't work
由于在 jenkins slaves 上执行,因此需要使用 hudson.Launcher.ProcStarter。
有什么想法,如何写入 alredy 运行 进程的标准输入?
我得到了解决方案,调用 proc.writeStdin() 方法反转 I/O 方向很重要:
ProcStarter procStarter = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
proc.writeStdin();//important ==> Indicates that the caller will directly write to the child process stdin()
Proc myProc = procStarter.start();
myProc.getStdin().write(("helloooo2" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
myProc.getStdin().flush();
我正在尝试写入已启动进程的标准输入,它已经是 运行。 在进程启动时写入 sdtin 有效:
外部脚本1.sh:
#!/bin/sh
echo "Started at $(date)"
read a
echo "$(date): got '$a'"
插件中的代码:
ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
proc.stdin(res).join();
jenkins控制台输出,开始时间和写入sdtin的时间戳相同:
$ /tmp/1.sh
Started at Thu Apr 2 10:52:02 CEST 2020
Thu Apr 2 10:52:02 CEST 2020: got 'hellooo'
我不想在开始时写入 sdtin,而是在 x 秒后,类似这样的伪代码:
ProcStarter proc = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
proc.join(); //blocks
//somewhere in another Thread:
Thread.sleep(15000);//pseudocode ;-)
ByteArrayInputStream res = new ByteArrayInputStream(("hellooo" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
proc.stdin(res); // doesn't work
由于在 jenkins slaves 上执行,因此需要使用 hudson.Launcher.ProcStarter。 有什么想法,如何写入 alredy 运行 进程的标准输入?
我得到了解决方案,调用 proc.writeStdin() 方法反转 I/O 方向很重要:
ProcStarter procStarter = launcher.launch().stderr(listener.getLogger()).stdout(listener.getLogger()).cmds("/tmp/1.sh");
proc.writeStdin();//important ==> Indicates that the caller will directly write to the child process stdin()
Proc myProc = procStarter.start();
myProc.getStdin().write(("helloooo2" + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
myProc.getStdin().flush();