Разработка плагина Jenkins, ProcStarter: Как написать на стандартный ввод уже запущенного процесса - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь записать в stdin запущенного процесса, который уже запущен. Запись в 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

Использование hudson.Launcher.ProcStarter необходимо из-за выполнения на подчиненных устройствах jenkins. Есть какие-нибудь идеи, как мне написать в stdin процесса запуска alredy?

1 Ответ

0 голосов
/ 06 апреля 2020

Я получил решение, важно вызвать метод pro c .writeStdin (), который меняет направление ввода / вывода:

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();
...