我有两个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文件移动到公共可访问的文件夹中。
完成后,它发送电子邮件通知所有这些已经发生,并概述可以从中下载所有内容的各种链接。
begin.sh
执行,以便在任何其他process.sh
实例正在运行时不运行process.sh
吗? - Etan Reisnerbegin.sh
等待其完成。第二次运行begin.sh
将不知道第一次运行的情况,而会启动自己的process.sh
运行。我无法看出第二行上的exec
对您有任何作用,除非您在后台运行了某些内容(使用&
)。如果您在begin.sh
的顶部添加set -x
并运行两次,您从第二次运行中得到什么输出? - Etan Reisnerbegin.sh
进程相互知晓的问题上。这是一个标准的问题。解决方案主要涉及某种锁定文件或类似机制。或者将问题反转为作业队列提交过程。 - Etan Reisner