#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/