【问题标题】:restricting xargs from reading stdin to buffer限制 xargs 将标准输入读取到缓冲区
【发布时间】:2011-07-01 19:12:15
【问题描述】:

看起来 xargs 从标准输入读取输入行,即使它已经在运行它可以运行的最大进程数。

这是一个例子:

#!/bin/bash
function xTrigger()
{
   for ii in `seq 1 100`; do echo $ii; sleep 2; done
}
function xRunner()
{
   sleep 10;
   echo $1;
}
export -f xTrigger
export -f xRunner
bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"

在启动上述过程 20 秒后,我 killall xTrigger,所以但 xargs 已经缓冲了 xTrigger 打印的所有内容,因此 xRunner 继续打印 1..10。我想要的是它只打印 1,2

有什么方法可以改变这种行为并让 xargs 仅在它想要启动新命令时从 stdin 读取,以便 xTrigger 会在 echo 语句处等待直到 xargs 从中读取?我的标准输入有非常动态的内容,所以这将非常有用。

试图坚持使用 xargs 只是因为它会稳定且优雅。只有在没有使用 xargs 的简单方法时才想编写额外的代码。

感谢您的帮助!

【问题讨论】:

  • bash: xTrigger: command not found - 你的函数没有传递给子shell,是吗? xRunner 也是如此。你为什么不做xTrigger | xargs -n 1 -P 1 -i xRunner?我们在哪里:反引号已弃用,请改用$(...),因为它可读性更好,字体独立且易于嵌套。最后:for ii in {1..100} 更好,因为它是内置的,不需要外部程序序列。虽然我不知道你的主要问题的答案,但猜测:不,不会飞。应该怎么做?按参数?通过代码修改和重新编译?缓存不是 xargs 的核心思想吗?
  • xTrigger | xargs -n 1 -P 1 -i xRunner 也不起作用,因为管道启动子外壳,是吗?因此,您需要 2 个脚本,xTrigger.sh 和 xRunner.sh,并且无论如何都需要它,因为您无法使用 killall 停止函数 - 可以吗?
  • 对不起,我忘记了几行。编辑代码以修复它。这些是进程,使用进程以便我们可以杀死它们,而 xargs 无法启动进程,所以我们必须使用 bash -c 'functionname'
  • 哎呀。我的意思是 xargs 无法启动 function
  • xargs 无法知道如果右边的进程阻塞,左边的进程已经死亡。

标签: bash pipe xargs


【解决方案1】:

你不必杀死 xTrigger() 的 Bash PID 吗?

bash -c "echo $$; xTrigger" | xargs -n 1 -P 1 bash -c 'xRunner "$@"' _
kill -HUP <PID>

【讨论】:

    【解决方案2】:

    在我的系统上,如果 xargs 正在运行的作业之一以非零返回码退出,它将默认停止。因此,您应该将信号发送到正在运行 XRunner 的 bash pid。

    【讨论】:

      【解决方案3】:

      只有在没有 'bash -c xRunner' 作业运行时,才让 xTrigger 生成下一个触发器。现在效果很好:

      #!/bin/bash
      function xTrigger()
      {
         for ii in `seq 1 100`; do 
            echo $ii; 
            while [[ $(psgrep xRunner|grep -v xargs|wc -l) -ge 1 ]]; do
               sleep 2; 
            done
         done
      }
      function xRunner()
      {
         sleep 10;
         echo $1;
      }
      export -f xTrigger
      export -f xRunner
      bash -c "xTrigger" | xargs -n 1 -P 1 -i bash -c "xRunner {}"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-25
        • 2011-05-18
        • 2018-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多