【问题标题】:Sending the command(s) spawned by xargs to background将 xargs 生成的命令发送到后台
【发布时间】:2010-12-29 11:09:19
【问题描述】:

我想知道如何将 xargs 生成的命令发送到后台。 例如,考虑

find . -type f  -mtime +7 | tee compressedP.list | xargs compress

我试过了

find . -type f  -mtime +7 | tee compressedP.list | xargs -i{} compress {} &

.. 出乎意料的是,它似乎将 xargs 发送到后台?

如何让 compress 命令的每个实例进入后台?

【问题讨论】:

    标签: background xargs unix


    【解决方案1】:

    对于 SunOS,您可以查看 GNU Parallel http://www.gnu.org/software/parallel/

    find . -type f  -mtime +7 | tee compressedP.list | parallel compress
    

    如果文件名包含 ' " 或空格,它还有一个额外的好处,即不会错误终止。添加 -j+0 将使其每个 CPU 核心运行一次压缩。

    【讨论】:

      【解决方案2】:

      在 SunOS/Solaris 上,将命令包装在对 sh(或其他 shell)的调用中:

      find . -type f  -mtime +7 | tee compressedP.list | xargs -Ifname sh -c 'compress fname &'
      

      这应该在没有其他工具的情况下并行运行压缩。

      【讨论】:

      • 无论如何,在 Linux 上,这种后台处理将导致 xargs 立即生成被管道输入的列表所调用的下一个进程。如果compressedP.list 中有很多内容,您将耗尽内存。
      【解决方案3】:

      使用 --max-procs / -P 选项在后台运行 xargs 目标。来自 GNU xargs 4.2.27 版的手册页:

      --max-procs=max-procs, -P max-procs

      一次最多运行 max-procs 个进程;默认值为 1。如果 max-procs 为 0,xargs 将一次运行尽可能多的进程。将 -n 选项与 -P 一起使用;否则很可能只有一名执行官会被完成。

      (您可能希望将其与-n 1 结合使用,以确保您要压缩的每个文件都有一个新进程)

      【讨论】:

      • (嗯,刚刚意识到我的答案是 gnarf 答案后半部分的副本,在关于编写 shell 脚本的开场评论之后我没有阅读。我会在这里留下我的答案以防其他人也像我一样略读 gnarf 的答案)
      【解决方案4】:

      当我想编辑所有包含 foo 的文件时,这对我有用

      grep -rl foo ./ | `xargs emacs` &

      【讨论】:

      • 这会启动一个额外的不必要的子shell。最好对 xargs 使用 -P 参数。
      【解决方案5】:

      您可能可以制作一个非常快速的 shellscript 来调用 compress。

      #!/bin/sh 
      # call it 'compbg' and chmod a+x
      compress $* &
      

      然后

      find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} compbg {}
      

      虽然我认为使用这个 xargs 参数你可能会更开心:

       -P maxprocs
               Parallel mode: run at most maxprocs invocations of utility at once.
      

      此命令应一次查找 /tee / 压缩 10 个文件,直到完成,并立即将控制权返回给调用脚本/shell。

      find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} -P10 compress {} &
      

      【讨论】:

      • 我拥有的 UNIX ( $ uname -a SunOS xxx 5.10 Generic_xx7xx1-06 sun4u sparc SUNW,Sun-Fire ) 没有 -P ( $ xargs -P xargs: 非法选项 -- P xargs:用法:xargs: [-t] [-p] [-e[eofstr]] [-E eofstr] [-I replstr] [-i[replstr]] [-L #] [-l[#]] [- n # [-x]] [-s size] [cmd [args ...]] ) 除了 shell 脚本包装器还有其他替代方案吗?
      • 抱歉,我找不到 SunOS 的很多内容 - 虽然我确实找到了这个包“xjobs”,您可能可以编译它...maier-komor.de/xjobs.html
      猜你喜欢
      • 2011-08-25
      • 2012-06-26
      • 1970-01-01
      • 1970-01-01
      • 2016-12-14
      • 2014-08-03
      • 2011-01-03
      • 2023-01-18
      • 2015-03-28
      相关资源
      最近更新 更多