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

标签 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 文件移动到可公开访问的文件夹。

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

最佳答案

锁的原理可以如下: 当您的脚本启动时,它做的第一件事是在其工作文件夹中创建一个空的 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/

相关文章:

java - daemonize java程序-输入一些数据后进入后台

python - 每隔 x 小时运行一个进程

android - 解释 Android 上执行的 Unix sleep() 函数的行为

linux - 如何使用我的 debian 软件包安装软件包?

arrays - Bash 数组脚本排除重复项

php - rwd-table 字体在移动设备中不可见

php - Magento 在产品上调用 isInStock() 方法时出现问题

arrays - Bash 关联数组排序

javascript - 如何在 Jquery 中单击每个按钮时获取新的时间或日期?

php - 如何将 mysql php 中的图像显示到 android 中?