在再次运行之前等待源bash脚本完成

时间:2015-10-22 18:40:39

标签: php linux bash shell queue

我有2个bash脚本..

第一个(begin.sh)是通过SSH2从外部PHP脚本接收变量(在此脚本中不可见,因为它们是动态的):

但他们看起来像这样:

 $1 = myfile.mp3
 $2 = artwork.jpg
 $3 = my title - my artist

这是第一个脚本(begin.sh):

#!/bin/bash

. ./process.sh

这是第二个(process.sh):

#!/bin/bash

wget -O /root/incoming/shows/$1 http://remoteserver.com/files/$1;

exec lame --decode /root/incoming/shows/$1 - | /root/incoming/stereo_tool_cmd_64 - - -s /usr/incoming/settings/settings.sts | lame -b 128 - /root/incoming/processing/$1;

wait

mv /root/incoming/processing/$1 /var/www/html/processed/$1;

#Send Email when process is complete

recipients="somebody@somewhere.com"
subject="Podcast Submission"
from="somebodyelse@somewhere.com"
importLink="http://thisserveraddress.com/processed/$1"
artwork="http://anotherserver.com/podcast-art/$2"

message_txt=$(echo -e "A new podcast has been submitted.\n\nTitle : $3\n\nImport : $importLink")

/usr/sbin/sendmail "$recipients" << EOF
subject:$subject
from:$from

$message_txt
EOF

上面脚本中的过程非常耗时(大约需要8分钟才能完成)并且处理器非常密集(使用大约50%的CPU),因此我只希望一次运行其中一个进程。麻烦的是,整个过程可以由多个用户随时远程执行。因此,我需要找到一种按顺序运行这些作业的方法。

我认为采购流程脚本会有效地排队工作,但事实并非如此。如果脚本在已经运行的情况下再次执行,则不会发生任何事情。

有什么建议吗?

进一步说明process.sh脚本为清晰起见做了什么....

首先主机从remoteserver.com下载mp3文件

然后它需要下载的mp3文件并使用lame将其解码为wav,然后另一个应用程序对该文件执行一大堆音频处理,然后将其重新编码为mp3。

完成后,它会将新的mp3文件移动到可公开访问的文件夹中。

完成后,它会发送一封电子邮件通知所有这些已经发生,并概述了可以从中下载所有内容的各种链接。

1 个答案:

答案 0 :(得分:2)

锁定原则如下: 当您的脚本启动时,它首先要做的是在其工作文件夹中创建一个空的script.lock文件。 完成后删除script.lock文件。 编辑:更好的是,您可以使用mkdir创建一个script.lock DIRECTORY,由Dror Cohen在评论中消化

这是一般的想法。 为了工作它实际上只有在没有当前存在的script.lock时才需要真正启动。如果是,它会在/ queue /文件夹中创建一个包含调用参数的新文件。

所以最后你会得到一个类似于:

的begin.sh

首先检查script.lock是否存在。
- 如果是,则在/ queue /中写入一个新文件并停止
- 如果没有,请创建script.lock并继续

在脚本的最后,它检查/ queue /文件夹中是否有任何文件 - 如果没有,则删除script.lock并停止
- 如果/ queue /中有文件,它将使用较旧的文件,删除它并使用文件中保存的参数再次启动。