如何在 Unix 中同时搜索和执行两个脚本?

Posted

技术标签:

【中文标题】如何在 Unix 中同时搜索和执行两个脚本?【英文标题】:How can I search and execute two scripts simultaneously in Unix? 【发布时间】:2019-02-23 15:26:24 【问题描述】:

假设您有一个包含两个文件的文件夹。

例如:stop_tomcat_center.shstart_tomcat_center.sh

在我的示例中,ls *tomcat* 的返回返回这两个脚本。 如何同时搜索和执行这两个脚本?

我试过了

ls *tomcat* | xargs sh

但只执行第一个脚本(不是第二个)。

【问题讨论】:

同时停止和启动tomcat似乎不太明智...... 您可以使用at UNIX 功能。 我的回答或其他人是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步为您提供帮助。谢谢。 meta.stackexchange.com/questions/5234/… 【参考方案1】:

使用 GNU Parallel 可以轻松并行执行多项操作:

parallel ::: ./*tomcat*

或者,如果您的脚本在第一行没有 shebang:

parallel bash ::: ./*tomcat*

或者如果你喜欢xargs:

ls *tomcat* | xargs -P 2

【讨论】:

【参考方案2】:

xargs 缺少 -n 1 选项。

来自man xargs

-n 最大参数,--max-args=最大参数

每个命令行最多使用 max-args 个参数。如果超出大小(参见 -s 选项),将使用少于 max-args 的参数,除非给出 -x 选项,在这种情况下 xargs 将退出。

xargs 否则会尝试使用尽可能多的参数来执行命令,这对大多数命令都是有意义的。

在您的情况下,ls *tomcat* | xargs sh 正在运行 sh stop_tomcat_center.sh start_tomcat_center.sh,而 stop_tomcat_center.sh 可能只是忽略了 $1 参数。


此外,使用 ls 的输出也不是一个好主意。更好的方法是使用find -maxdepth 1 -name '*tomcat*' -print0 | xargs -0 -n 1 shfor command in *tomcat*; do sh "$command"; done


这个答案是基于这样的假设,即当他“同时”写作时,OP 的意思是“两个都有一个命令行”。

有关并行执行的解决方案,请查看其他答案。

【讨论】:

对于并行执行,您需要| xargs -n1 -Px,我认为x 是所需的并发性。 @bobah 我敢肯定,当他写“同时”时,OP 并不是指“并行”,他只是用一个命令行表示两者。 (不会有多大意义运行停止/启动并行)【参考方案3】:

您可以通过以下方式搜索并执行

find . -name "*.sh" -exec sh x  \;

find 会找到文件,exec 会找到匹配并执行

【讨论】:

以上是关于如何在 Unix 中同时搜索和执行两个脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Unix中的java中执行sql脚本文件

我如何在linux / unix / bash脚本中搜索文件中的十六进制内容?

如何在unix系统中用别的用户运行一个程序?

如何在Unix中为shell脚本锁定目录[重复]

如何使用python执行远程shell脚本

如何在 UNIX shell 脚本中执行临时存储过程?是不是可以在 sql-plus 中使用 IF-ELSE/WHILE 循环?