【问题标题】:execute shell with find gun at background在后台使用 find gun 执行 shell
【发布时间】:2019-09-29 14:35:12
【问题描述】:

我在同一目录中有一组shell,我想执行所有开头有结果的shell,例如:

result.sha
result.shb
result.shc
...

它的工作发现下面的脚本用匹配的reg执行所有shell,但是我怎样才能让它们中的每一个在后台并行运行

find . -type f -name 'result.*' -exec sh {} \;

我试过了,但它不起作用:

find . -type f -name 'result.*' -exec sh {} \;&

【问题讨论】:

  • 请注意,以sh scriptname 运行程序不是很好的形式;这样做会忽略该程序的 shebang,阻止它选择使用哪个 shell(如果它,f/e,需要 ksh 或 bash 扩展;或者是 Python 或 awk 脚本或编译的可执行文件而不是 shell 脚本)全部)。相比之下,./scriptname 让操作系统启动选择的脚本解释器。

标签: shell unix solaris


【解决方案1】:

每批find 结果只启动一次sh 效率更高,并让它分叉出尽可能多的子进程。

find . -type f -name 'result.*' -exec sh -c 'for arg do . "$arg" & done' _ {} +

. "$arg" & 分叉出已经运行的解释器的副本并在其中运行 "$arg" 中的代码,避免支付额外的解释器启动成本。

【讨论】:

    【解决方案2】:

    我认为您的解决方案在后台运行 find 程序,而不是在后台执行每个 shell 脚本。我尝试使用 find 实用程序,但无法使其正常工作。但是,以下 shell 脚本将满足您的要求。

    #!/bin/bash
    for prog in result.*
    do
        sh $prog &
    done
    exit 0
    

    或 1 行上的等效指令

    【讨论】:

      猜你喜欢
      • 2011-12-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2016-07-04
      相关资源
      最近更新 更多