bash linux — запись и чтение из stdin и stdout

#linux #bash #stdout #stdin

#linux #bash #стандартный вывод #stdin

Вопрос:

У меня есть приложение, которое я могу запустить из строки commonand, и оно действует для меня как CLI.

Однако это часть набора приложений, и теперь я хочу, чтобы все они запускались при загрузке, и поэтому они запускаются как служба (systemd).

Итак, все мои приложения, включая мой CLI, работают отлично. Однако я не вижу выходных данных CLI и не могу отправлять на него команды.

Я использовал стандартный вывод для печати экрана командной строки — думаю, я могу обойти это, выполнив вывод в файл, но было бы неплохо получить доступ к его стандартному выводу. Большая проблема в том, что я не могу записывать в его stdin.

Я прочитал это: запись в stdin-of-background-process и попытался echo -e "commandn" > /proc/.../0 , но ничего не произошло — я проверил журнал моего CLI (записывается в файл), и он не получил входные данные.

Затем я ls -l включил /proc/<pid>/fd/ и заметил, что 0 --> /dev/null значение stdin связано с /dev/null .

Итак, как я могу получить доступ к его stdin?

Дополнительный вопрос — есть ли способ работать (в той же оболочке bash) так, чтобы я перенаправлял свой stdin на stdin этого процесса И перенаправлял стандартный вывод процесса в мою оболочку?

Комментарии:

1. Я не знаю, работает ли это, но одна идея — создать fifo с помощью mkfifo /tmp/hoo . И в наборе файлов systemd: ExecStart=/bin/sh -c '/your/cli/command < /tmp/hoo' . Теперь, если вы echo -e "commandn" > /tmp/hoo" должны передать его в /your/cli/command

2. @ymonad Я просто сначала тестирую это в командной строке. Когда я запускаю ./myapp < /tmp/hoo (после создания fifo), кажется, что приложение не запускается, пока я не выполню свою первую команду echo для него. Это довольно странно! — но после этого он начинает работать

3. возможно, ваша команда cli не предназначена для доступа через stdin. вы проверили, что echo command | /your/command это работает?

4. @ymonad — да, это сработало… Ваша первая идея сработала, но приложение, похоже, не запускалось, пока не была получена первая команда, а затем оно работало нормально

Ответ №1:

Найдите терминал (pty), который вы хотите перенаправить. Пример перенаправления pty0 может быть выполнен через:

 exec < /dev/pty0  #stdin
exec > /dev/pty0  #stdout
  

Комментарии:

1. Как вы находите /dev/pty?

2. Аналогично вы сделали для фонового процесса /proc/<pid>/fd/ . Итак, перейдите к активному терминалу, затем выполните echo $$, который даст вам pid текущей оболочки, и если оболочка интерактивна, она должна установить pty в /proc/<pid>/fd/