【问题标题】:I am looking for a way to call multiple shell scripts in a serialized manner from a base shell script我正在寻找一种从基本 shell 脚本以序列化方式调用多个 shell 脚本的方法
【发布时间】:2017-03-29 16:01:25
【问题描述】:

我正在寻找一种从基本 shell 脚本以序列化方式调用多个 shell 脚本的方法。场景:

一个shell脚本- Base_script.sh ,它将在内部调用:

script_1.sh ,
脚本_2.sh , 脚本_3.sh,

一旦“script_1.sh”完成,那么只有它应该调用“script_2.sh”等等。

我尝试过的所有方法都是以某种方式一次执行所有脚本。 操作系统:使用 Shell/Bash 的 RHEL

编辑:作为对某些 cmets 的回应,我同意,我可以使用(我已经这样做了):

  • script1.sh && script2.sh
  • 逐个调用每个脚本(sh script1.sh; sh script2.sh ..so on)
  • 甚至尝试使用数组来声明脚本,然后在循环中执行每个脚本

我得到的问题和解决方案:

每个脚本(例如“script_1.sh”)都是一个复杂的脚本。它都在做某种数据库基准测试。 脚本在执行时具有一些在后台运行的函数 (someFunction &)。因此,即使脚本实际上被一个一个地调用,但先前脚本的处理仍在后台继续进行。

必须重新设计整个东西以使“Base_script.sh”本身中的每个模块和功能。

感谢大家的回答。欣赏!!

【问题讨论】:

  • script_1.sh、script2.sh等是否在后台运行?你怎么知道三个脚本同时执行?你的意思是,例如,即使 1 先被调用,script2 在 script1 之前完成?
  • 你可以使用script1.sh && script2.sh,这样第二个脚本才会在前一个脚本成功后执行(退出状态0)
  • 不要只说“我尝试过的所有方法”——明确显示其中一些方法,并显示您的测试过程(及其结果)。在 shell 中一个接一个地运行命令,没有 & 显式背景,自动在开始下一个之前等待每个退出 - 所以我们可能在这里遇到的情况是你的脚本'重新运行是故意构建的背景。
  • 顺便说一句,我见过人们错误地做的一件事是尝试在没有足够引用的情况下传递包含& 符号的参数。如果你实际上是在运行./script1.sh http://example.com/foo?bar&baz,那么那就是在后台运行./script1.sh http://example.com/foo?bar,尝试在前台运行一个名为baz 的命令,然后继续到脚本中的下一行。
  • 但是,为了进行准确诊断,您需要提供一个复制器,让其他人看到您自己报告的问题。

标签: linux bash shell unix scripting


【解决方案1】:

在一般情况下,这里根本不需要。

./script1
./script2
./script3

...将自动等待script1退出,然后再运行script2


另一方面,您可能遇到的情况是您的script1 故意将自身设置为背景(该操作也称为“自我守护进程”)。等待守护进程退出的一种方法是使用文件系统级别的咨询锁定;下面使用flock 命令来达到这个目的:

flock -x my.lck ./script1
flock -x my.lck ./script2
flock -x my.lck ./script3
flock -x my.lck true

即使script1 本身退出,如果它有仍在运行的子进程在my.lck 上保存文件描述符,那么script2 将被阻止启动。

【讨论】:

    【解决方案2】:

    如上所述,您可以使用&&,或者如果您想让它更完整,您可以使用

    wait $!
    

    它将等待最后一个运行命令的 pid 退出。这样,您可以添加一些 if 语句以确保有效性。

    【讨论】:

    • 如果 OP 首先在一行上尝试./script_1.sh,然后在第二行上尝试./script_2.sh,等等,并且仍然看到他们描述的行为,那么这些脚本显然是自我守护进程而不是在后台显式启动。 wait 在这种情况下无济于事,因为它仅适用于 shell 的作业控制表中存在的条目。
    猜你喜欢
    • 2012-01-11
    • 2012-03-13
    • 2013-04-18
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2021-06-03
    相关资源
    最近更新 更多