【问题标题】:Waiting for bash script job to finish before starting another在开始另一个之前等待 bash 脚本作业完成
【发布时间】:2016-01-20 19:31:35
【问题描述】:

我有一种感觉,这不会像我希望的那么简单..

我理解在 bash 脚本中使用 & 然后 wait 的概念,但是这可以应用于在第一个进程仍然没有的情况下多次运行的同一个脚本'完成了吗?

我会尝试更好地解释我的意思。

假设我有这个脚本:

#/!/bin/bash

COMPLETE="download complete"
wget /root/downloads/ http://linktoareallymassivefile.wav &
wait;
echo $COMPLETE

现在忘记运行这个实际脚本会暂时覆盖之前下载的文件这一事实。

我执行它,它开始下载,然后我再次执行它,但我希望第一个进程在第二个进程开始之前完成。

那么这样的事情会起作用吗? :

 #/!/bin/bash

wait;
COMPLETE="download complete"
wget /root/downloads/ http://linktoareallymassivefile.wav &
wait;
echo $COMPLETE &

我非常怀疑它会不会,但我想你可以看到我在问什么。

或者,我担心,在这种情况下是否需要更复杂的基于队列的解决方案?

【问题讨论】:

  • 我猜你的 2 次下载示例真的会扩展到 N 个并发脚本运行等待对方吗?如果没有,并且只有 2 个(或已知数字),您可以使用锁定文件,但这已接近您可怕的(理所当然地)“基于队列的解决方案”。与下面的一个解决方案相关,您可以编写一个脚本来动态创建一个脚本(读取要从 ?? 下载的文件列表),其中每次下载只调用 wget(没有&)?祝你好运。
  • 在后台运行作业后立即调用wait 相当于在前台运行作业。
  • @shellter 并不容易,因为脚本运行所需的变量来自使用 SSH2 的外部 PHP 脚本。事实证明,这比我最初希望的要复杂得多。我可以看到编写一个主脚本然后触发进程脚本的逻辑,但是我如何继续添加到该主脚本以将作业排队而不启动一个全新的进程?我认为这可能超出了我的能力范围。
  • 所以我想您是在问“如何在主脚本已经运行时将新文件附加到主脚本的末尾”?但是你的反对“没有开始一个全新的过程”(在 99% 的情况下)不是问题。每次您启动wget 时,您都在启动一个新进程。它将消耗新的磁盘空间来写入新文件和网络带宽。 CPU对您的问题的重要性非常低。所以我认为你让这对自己来说太难了。
  • 或考虑 2 个进程,其中一个唯一的职责是将唯一编号的文件放入队列目录中。该文件内是您要下载的文件的 URL。在第二个脚本中,您将其读入 var,执行 wget opts $URL_to_file ... 。完成后,删除编号的文件。并获得下一个并根据需要重复。这一切都在while 循环中。您可以测试空目录和sleep 60,然后重试。正如我的 shell 教练过去常说的,“20 分钟”:-)。如果这是有道理的,请将您对该解决方案的最佳尝试作为一个新问题发布并寻求帮助。祝你好运。

标签: linux bash queue wait


【解决方案1】:

每次运行脚本时,都会启动一个新进程。 每个进程都独立于其他所有进程。 wait 不会影响任何其他脚本。

所以要么修改脚本以合并所有命令:

wget /root/downloads/ http://linktoareallymassivefile1.wav
wget /root/downloads/ http://linktoareallymassivefile2.wav

或者制作一个新脚本来调用原来的脚本:

script.py
script.py

如果你不使用&,那么在第一个命令完成之前不会执行下一个命令。

【讨论】:

  • 我无法合并它们,因为实际脚本是通过 PHP / SSH2 获取动态变量,它依赖于它才能执行任何操作。是否有某种排队系统可以在工作进入并排队时处理它们?问题是我在脚本中运行的进程非常占用 CPU,我只希望它一次运行该脚本的一个实例。
  • 然后使用第二个选项:制作一个新脚本多次调用原脚本。
  • 啊,我想我明白你的意思了,所以捕获新脚本中的所有参数,将它们发送到原始脚本并在新脚本中对进程进行排队?进程1等待;进程2等待;等等?
  • 是的,除非您不需要&wait。如果你只是在没有&wait 的情况下调用脚本,那么每次调用都会在前台运行,并且新脚本中的后续行在完成之前不会运行。
【解决方案2】:

如果您根本不使用& 将进程推送到后台,并删除wait,则wget 的执行将只需要尽可能长的时间。

【讨论】:

    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多