我在研究排队问题的解决方案时遇到了这个问题。为了其他在这里搜索的人的利益,这是我的解决方案。
将此与按计划启动作业的 cron 相结合(即使它们计划同时运行),也可以解决您描述的问题。
问题
- 最多应该运行一个脚本实例。
- 我们希望提示请求以尽快处理它们。
IE。我们需要一个通往脚本的管道。
解决方案:
为任何脚本创建管道。使用一个小的 bash 脚本完成(进一步向下)。
该脚本可以称为
./pipeline "<any command and arguments go here>"
例子:
./pipeline sleep 10 &
./pipeline shabugabu &
./pipeline single_instance_script some arguments &
./pipeline single_instance_script some other_argumnts &
./pipeline "single_instance_script some yet_other_arguments > output.txt" &
..etc
该脚本为每个命令创建一个新的命名管道。所以上面将创建命名管道:sleep
、、shabugabu
和single_instance_script
在这种情况下,初始调用将启动阅读器并single_instance_script
作为some arguments
参数运行。一旦调用完成,读者将从管道中获取下一个请求并执行some other_arguments
,完成,获取下一个等......
此脚本将阻止请求进程,因此将其称为后台作业(最后是 & )或带有at
( at now <<< "./pipeline some_script"
)的分离进程
#!/bin/bash -Eue
# Using command name as the pipeline name
pipeline=$(basename $(expr "$1" : '\(^[^[:space:]]*\)')).pipe
is_reader=false
function _pipeline_cleanup {
if $is_reader; then
rm -f $pipeline
fi
rm -f $pipeline.lock
exit
}
trap _pipeline_cleanup INT TERM EXIT
# Dispatch/initialization section, critical
lockfile $pipeline.lock
if [[ -p $pipeline ]]
then
echo "$*" > $pipeline
exit
fi
is_reader=true
mkfifo $pipeline
echo "$*" > $pipeline &
rm -f $pipeline.lock
# Reader section
while read command < $pipeline
do
echo "$(date) - Executing $command"
($command) &> /dev/null
done