【问题标题】:Some questions regarding how to use a shell interactively with another shell in linux关于如何在 linux 中与另一个 shell 交互使用 shell 的一些问题
【发布时间】:2013-12-05 15:48:15
【问题描述】:

这篇文章是关于一些自动化任务的,也是为了满足我的好奇心。

这种情况是否可能,谁能提供任何实用的指针?

运行一个shell脚本

shell_exec(bash script);

像这样的 Bash 脚本:

  • 运行一个外壳;
  • 读取文件进行输入;
  • 将输入传递给 shell;
  • 从 shell 中获取结果;
  • 写入另一个文件进行输出。
  • 保持无限循环。

例如将输入命令写入文件:

  • 等待几秒钟
  • 为结果读取输出文件
  • 根据输出,将新的输入命令写入文件
  • 循环继续。

【问题讨论】:

  • 是的,这是可能的。原来的“输入命令”从何而来?
  • 我将从网络中另一个盒子上的终端写入共享文件夹中的文件。
  • 您可以创建一个也可以处理并发访问的小型服务器,而不是一个文件,您可以使用 php.ini 轻松创建一个。类似stackoverflow.com/questions/14399801/…squirrelshaterobots.com/programming/php/…
  • 我最不确定的是如何让 shell 1 与 shell 2 交互地传递命令/读取输出。有什么想法吗?
  • 相当简单,试一试...听起来每次循环只执行一个shell。

标签: php linux bash shell


【解决方案1】:

我将留下一个无耻的链接,指向我演示这样做的帖子,“expect in php”:http://codehackit.blogspot.be/2012/04/automating-command-line-scripts-in-php.html

基本上它只是 proc_open() 的一个包装器,它返回用于写入和读取到另一个进程 stdin/stdout 的 FD。 http://php.net/manual/en/function.proc-open.php

【讨论】:

  • 有趣,您能否从命令行运行它并动态轮询文件以获取用户输入,而不是预设自动化? (假设你可以防止任何超时)
  • 我确信你的要求是可能的,尽管我承认我看不到它的用途。您只需将文件作为流打开并使用 stream_select 函数将 3 个流多路复用在一起。
  • @smassey 嘿,我试过你的脚本,遇到了问题,你能指点一下吗? pastebin.com/c41snHpi 当我运行它时,它运行程序,但浏览器超时.. 似乎测试程序正在等待输入并且脚本没有输入任何内容。
【解决方案2】:

为了避免部分读取和写入的问题(由于 io 缓冲和竞争),您可能需要考虑使用像这样的 in/out-box 目录:

  1. 在目录中使用“临时”名称创建命令文件(例如“cmd_`date +%s`.txt.tmp”)
  2. 完成对给定命令文件的写入后,关闭它(以刷新缓冲区),然后重命名它以删除“.tmp”。重命名是文件系统中的原子操作。
  3. 让正在使用的 bash“守护进程”只查看“cmd_*.txt”(而不是 .tmp),当它使用给定命令完成时,删除 cmd 文件或将其重命名为“.done”后缀. (如果您需要多个并行工作守护进程,您甚至可以重命名为“.processing”以在处理 cmd 时“声明”它。这样做时请务必检查重命名的返回码,看看是否有另一个工人跑得比你快。)

对输出文件也这样做。

【讨论】:

  • 这是处理该问题的明智方法,感谢您的意见。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2020-10-11
  • 2012-03-18
  • 2015-05-25
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
相关资源
最近更新 更多