Php 等待源bash脚本完成,然后再次运行它

Php 等待源bash脚本完成,然后再次运行它,php,linux,bash,shell,queue,Php,Linux,Bash,Shell,Queue,我有2个bash脚本 第一个(begin.sh)是通过SSH2从外部PHP脚本接收变量(在该脚本中不可见,因为它们是动态的): 但它们看起来像这样: $1 = myfile.mp3 $2 = artwork.jpg $3 = my title - my artist 以下是第一个脚本(begin.sh): 下面是第二个(process.sh): #/bin/bash wget-O/root/incoming/shows/$1http://remoteserver.com/files/$1

我有2个bash脚本

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

但它们看起来像这样:

 $1 = myfile.mp3
 $2 = artwork.jpg
 $3 = my title - my artist
以下是第一个脚本(begin.sh):

下面是第二个(process.sh):

#/bin/bash
wget-O/root/incoming/shows/$1http://remoteserver.com/files/$1;
exec lame--decode/root/incoming/shows/$1-|/root/incoming/stereou_tool_cmd_64----s/usr/incoming/settings/settings.sts | lame-b128-/root/incoming/processing/$1;
等待
mv/root/incoming/processing/$1/var/www/html/processed/$1;
#流程完成时发送电子邮件
收件人=”somebody@somewhere.com"
主题=“播客提交”
from=”somebodyelse@somewhere.com"
导入链接=”http://thisserveraddress.com/processed/$1"
艺术品=”http://anotherserver.com/podcast-art/$2"
message_txt=$(echo-e“已提交新播客。\n\n标题:$3\n\n报告:$importLink”)

/usr/sbin/sendmail“$recipients”锁定原则如下: 脚本启动时,它要做的第一件事是在其工作文件夹中创建一个空的script.lock文件。 当它完成时,会删除script.lock文件。 编辑:更好的是,您可以使用mkdir创建script.lock目录,正如Dror Cohen在其评论中所建议的那样

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

因此,最后您将有一个begin.sh,类似于:

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

在脚本的最后,它检查/queue/文件夹中是否有任何文件。
-如果没有,则删除script.lock并停止

-如果/queue/中有一个文件,它将使用较旧的文件,将其删除,并使用保存在文件中的参数重新启动。

您需要多次独立执行
begin.sh
才能不运行
process.sh
如果
process.sh
的任何其他实例正在运行?@EtanReisner,我需要begin.sh将作业排队。我认为通过寻找流程脚本,它将等待当前流程完成,然后启动新流程,但事实并非如此。正如我上面提到的,如果在process.sh运行时执行begin.sh,则会忽略它,并且新进程永远不会运行。这样的脚本源代码将导致
begin.sh
等待它完成。第二次运行
begin.sh
将对第一次运行一无所知,并将启动自己的
进程.sh
运行。第二行的
exec
没有为您做任何事情,我可以告诉您,您不需要
等待
,除非您在后台运行了一些东西(使用
&
)。如果将
set-x
添加到
begin.sh
顶部并运行两次,第二次运行会得到什么输出?@EtanReisner谢谢,我已从process.sh中删除exec并等待。我还在begin.sh中添加了set-x。现在它同时运行两个进程,这正是我想要避免的。因此,问题又回到了需要不同的
begin.sh
进程来了解彼此。这是一个标准的问题。解决方案大多涉及某种锁文件或类似机制。或者将问题转化为作业队列提交过程。文件检查不是原子的。你应该修正你的答案,改为使用目录检查,谢谢,我从来没有意识到这一点。在时间紧迫的情况下,这肯定很重要:)@CCH这听起来正是我所需要的。我试图在Dror链接到的帖子中实现解决方案,但我不知道如何做你提到的最后一件事,删除锁和停止等。。。你能给我举个工作实例吗?我在这里有点不知所措。另外,我仍然不明白队列系统将如何工作。实际上,在阅读了您的原始答案几次之后,我确实完全理解了这个概念,但不知道如何实现它。任何帮助都是非常受欢迎的,我还在这里学习:)我知道你在begin.sh中找到了如何做第一部分。对于最后一部分,最好的方法是在process.sh结束时执行完全相同的操作,但使用rmdir而不是mkdir。通过这种方式,您还可以将锁目录用作队列文件夹,从而充分利用锁目录的使用。如果你把你到目前为止所做的事情贴出来,我可以为你指出正确的方向。
#!/bin/bash

. ./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