我有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文件移动到可公开访问的文件夹中。
完成后,它会发送一封电子邮件通知所有这些已经发生,并概述了可以从中下载所有内容的各种链接。
答案 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 /中有文件,它将使用较旧的文件,删除它并使用文件中保存的参数再次启动。