【问题标题】:Can a process request a running shell process to run some command and receives the standard output of the command?进程能否请求正在运行的 shell 进程运行某些命令并接收命令的标准输出?
【发布时间】:2018-09-12 07:47:03
【问题描述】:

在 Linux API 方面,我们可以使用exec* 函数或system 函数开始运行一个shell,然后运行一些命令。

一个进程是否有可能请求一个已经在运行的 shell 进程(例如一个 bash 进程)运行一个命令,然后接收该命令的标准输出?例如,我想在正在运行的 shell 进程中运行的命令是那些生成特定于 shell 的状态信息的命令,例如dirs 和 jobs。

以上内容可以在 C 中使用一些实用程序在 bash 中完成吗(请参阅 here 和 here)?

例如,我想要一个 C 程序或 shell 脚本,它可以获得在现有 shell 进程中运行 dirs 和 jobs 的输出。

谢谢。

【问题讨论】:

  • 如果没有为该目的提前配置该 shell。
  • 谢谢。能否具体说明一下如何配置 shell?
  • 取决于细节。例如,您可以在 shell 中运行命令以从 FIFO 读取命令并将结果写入另一个 FIFO。如果您希望它在命令上执行此操作,则可以使用信号处理程序触发该代码。
  • 谢谢。可以举一些代码示例吗?
  • @l'L'l,...当我读到它时,您在其他答案中所做的与我理解的 OP 在这里要求的完全不同。在这里,他们正在自省其他交互式 shell,这与运行计划任务、在屏幕会话中或其他方面几乎没有关系。

标签: c linux bash shell


【解决方案1】:

如果您在 shell 启动期间评估以下内容:

dump_shell_data() {
  mkdir -p -- "$HOME/.shell-state" || return
  jobs >"$HOME/.shell-state/$$.jobs" 2>&1
  dirs >"$HOME/.shell-state/$$.dirs" 2>&1
}
trap dump_shell_data SIGUSR1

...然后将SIGUSR1 发送到运行上述代码的shell 将指示这些shell 将jobs 和dirs 输出跳转到以PID 命名的文件。

请注意,有很多警告。 shell 的用户可能会运行重新定义此陷阱的第 3 方脚本;并且阻塞等待命令退出的 shell 在该命令实际上完成之前不会执行陷阱。

【讨论】:

  • 谢谢。您将如何找出系统上的所有交互式 shell 并向它们发送 SIGUSR1?
  • pgrep?还是pkill -SIGUSR1?
  • pgrep 可以判断 bash 进程是否是交互式的吗?
  • 也就是说,如果您的所有 shell 都在运行该初始化代码,那么您可以使用相同的初始化代码安排定期 SIGALARM。对于一些非常丑陋的实现,请参阅unix.stackexchange.com/questions/156131/… - 这样您就不会向尚未设置正确处理它们的 shell 发送信号。
  • 也就是说,回答你之前的问题——如果它的名字是-bash或者它传递了参数-l,它就是一个登录shell;如果它是用bash -i 调用的,它是交互式的。大多。完整规则的 RTFM。
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多