【发布时间】: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 分钟”:-)。如果这是有道理的,请将您对该解决方案的最佳尝试作为一个新问题发布并寻求帮助。祝你好运。