如何在 Unix 中同时搜索和执行两个脚本?
Posted
技术标签:
【中文标题】如何在 Unix 中同时搜索和执行两个脚本?【英文标题】:How can I search and execute two scripts simultaneously in Unix? 【发布时间】:2019-02-23 15:26:24 【问题描述】:假设您有一个包含两个文件的文件夹。
例如:stop_tomcat_center.sh
和 start_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 sh
或for command in *tomcat*; do sh "$command"; done
这个答案是基于这样的假设,即当他“同时”写作时,OP 的意思是“两个都有一个命令行”。
有关并行执行的解决方案,请查看其他答案。
【讨论】:
对于并行执行,您需要| xargs -n1 -Px
,我认为x
是所需的并发性。
@bobah 我敢肯定,当他写“同时”时,OP 并不是指“并行”,他只是用一个命令行表示两者。 (不会有多大意义运行停止/启动并行)【参考方案3】:
您可以通过以下方式搜索并执行
find . -name "*.sh" -exec sh x \;
find 会找到文件,exec 会找到匹配并执行
【讨论】:
以上是关于如何在 Unix 中同时搜索和执行两个脚本?的主要内容,如果未能解决你的问题,请参考以下文章
我如何在linux / unix / bash脚本中搜索文件中的十六进制内容?
如何在 UNIX shell 脚本中执行临时存储过程?是不是可以在 sql-plus 中使用 IF-ELSE/WHILE 循环?