我有 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 文件移动到可公开访问的文件夹。
完成后,它会发送一封电子邮件,通知所有这一切都已发生,并概述了可以下载所有内容的各种链接。
最佳答案
锁的原理可以如下: 当您的脚本启动时,它做的第一件事是在其工作文件夹中创建一个空的 script.lock 文件。 完成后,它会删除 script.lock 文件。 编辑:更好的是,您可以使用 mkdir 创建一个 script.lock 目录,正如 Dror Cohen 在他的评论中所建议的那样
这是一般的想法。 为了工作,实际上只有在不存在当前 script.lock 时才需要真正启动。如果是,它会在/queue/文件夹中创建一个包含调用参数的新文件。
所以最后你会有一个像这样的 begin.sh :
首先检查script.lock是否存在。
- 如果是,则在/queue/中写入一个新文件并停止
- 如果没有,创建 script.lock 并继续
在脚本的最后,它检查/queue/文件夹中是否有任何文件。
- 如果没有,它会删除 script.lock 并停止
- 如果/queue/中有一个文件,它会使用较旧的文件,将其删除并使用文件中保存的参数重新启动。
关于php - 在再次运行之前等待源 bash 脚本完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33288351/