【问题标题】:bash linux - write and read from stdin and stdoutbash linux - 从标准输入和标准输出写入和读取
【发布时间】:2019-09-01 19:23:30
【问题描述】:

我有一个可以从 commonand 行运行的应用程序,它对我来说就像一个 CLI。

但是它是一组应用程序的一部分,现在我希望它们都在启动时运行,因此它们作为服务 (systemd) 启动。

所以我的所有应用程序(包括我的 CLI)都运行良好。但是我看不到 CLI 的输出,也无法向它发送命令。

我正在使用标准输出来打印 CLI 屏幕 - 我想我可以通过输出到文件来解决这个问题 - 但是访问它的标准输出会很好。更大的问题是我无法写入它的标准输入。

我读到这个:writing-to-stdin-of-background-process 并尝试echo -e "command\n" > /proc/.../0,但什么也没发生 - 我检查了我的 CLI 的日志(被写入文件),但它没有得到输入。

然后我在/proc/<pid>/fd/ 上做了一个ls -l,我注意到0 --> /dev/null 意味着stdin 链接到/dev/null。

那么,我怎样才能访问它的标准输入?

额外问题 - 有没有办法操作(在同一个 bash shell 中),以便我将我的标准输入重定向到此进程的标准输入并将进程标准输出重定向到我的 shell?

【问题讨论】:

  • 我不知道它是否有效,但一个想法是使用mkfifo /tmp/hoo 创建先进先出。在 systemd 文件集中:ExecStart=/bin/sh -c '/your/cli/command < /tmp/hoo'。现在如果你 echo -e "command\n" > /tmp/hoo" 它应该通过管道传送到 /your/cli/command
  • @ymonad 我只是先在命令行上测试它。当我运行./myapp < /tmp/hoo(在创建先进先出后)时,它似乎不会运行应用程序,直到我对其执行第一个回显命令。这很奇怪! - 但在那之后它确实开始工作
  • 也许您的 cli 命令不打算通过标准输入访问。你检查过echo command | /your/command 工作吗?
  • @ymonad - 是的,这行得通......你的第一个想法确实奏效了,但应用程序似乎直到收到第一个命令才启动 - 然后它正常运行

标签: linux bash stdout stdin


【解决方案1】:

找到您要重定向的终端 (pty)。 pty0 重定向的示例可以通过:

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

【讨论】:

  • 如何找到 /dev/pty?
  • 类似你为后台进程 /proc//fd/ 做的。所以转到活动终端,然后执行 echo $$,这将为您提供当前 shell 的 pid,如果 shell 是交互式的,它必须在 /proc//fd/ 中设置 pty