我有一个shell脚本,它通常在一次运行中运行近10分钟,但是我需要知道是否在脚本的一个实例已经运行时出现了另一个运行脚本的请求,新的请求是否需要等待现有实例来完成,还是将启动一个新的实例。
我需要一个新的实例必须启动时,一个请求是可用的相同的脚本。
怎么做..。
shell脚本是一个轮询脚本,它在目录中查找一个文件并执行该文件的file.The,执行过程中需要将近10分钟,如果一个新文件到达,它也必须同时执行。
shell脚本如下所示,以及如何修改它以执行多个请求。
#!/bin/bash
while [ 1 ]; do
newfiles=`find /afs/rch/usr8/fsptools/WWW/cgi-bin/upload/ -newer /afs/rch/usr$
touch /afs/rch/usr8/fsptools/WWW/cgi-bin/upload/.my_marker
if [ -n "$newfiles" ]; then
echo "found files $newfiles"
name2=`ls /afs/rch/usr8/fsptools/WWW/cgi-bin/upload/ -Art |tail -n 2 |head $
echo " $name2 "
mkdir -p -m 0755 /afs/rch/usr8/fsptools/WWW/dumpspace/$name2
name1="/afs/rch/usr8/fsptools/WWW/dumpspace/fipsdumputils/fipsdumputil -e -$
$name1
touch /afs/rch/usr8/fsptools/WWW/dumpspace/tempfiles/$name2
fi
sleep 5
done发布于 2016-02-25 13:05:35
在编写像您描述的脚本时,我采用两种方法之一。
首先,您可以使用pid文件来指示第二个副本不应该运行。例如:
#!/bin/sh
pidfile=/var/run/$(0##*/).pid
# remove pid if we exit normally or are terminated
trap "rm -f $pidfile" 0 1 3 15
# Write the pid as a symlink
if ! ln -s "pid=$$" "$pidfile"; then
echo "Already running. Exiting." >&2
exit 0
fi
# Do your stuff我喜欢使用符号链接来存储pid,因为编写符号链接是一种原子操作;两个进程不能相互冲突。您甚至不需要检查pid符号链接的存在,因为ln的失败清楚地表明pid不能被设置。这要么是权限或路径问题,要么是由于已经存在的符号链接。
第二个选择是使之成为可能。不,更好..。不要阻止其他实例,而是配置脚本所做的一切,以允许多台服务器同时在不同队列条目上运行。“单队列-单服务器”从来没有“单队列-多服务器”那么好。由于您的问题中没有包含代码,所以我无法知道这种方法对您是否有用,但是这里有一些解释元bash:
#!/usr/bin/env bash
workdir=/var/tmp # Set a better $workdir than this.
a=( $(get_list_of_queue_ids) ) # A command? A function? Up to you.
for qid in "${a[@]}"; do
# Set a "lock" for this item .. or don't, and move on.
if ! ln -s "pid=$$" $workdir/$qid.working; then
continue
fi
# Do your stuff with just this $qid.
...
# And finally, clean up after ourselves
remove_qid_from_queue $qid
rm $workdir/$qid.working
done这样做的效果是将“一次一次”的想法从处理程序转移到数据。如果您有一个多CPU系统,您可能有足够的能力同时处理多个队列条目。
发布于 2016-02-25 13:17:35
如果修改脚本是一个选项,ghoti's answer将展示一些有用的技术。
一般来说,对于现有的脚本:
除非你确信:
$$合并到文件名)或其他特定于实例的位置外,脚本没有其他副作用,我假设您不能安全地同时运行多个脚本副本。
期望平均shell脚本设计为并发使用是不合理的。
发布于 2016-02-25 12:44:52
从操作系统的角度来看,当然有几个进程可以并行执行相同的程序。不用担心这个。
然而,可以想象的是,当两个副本并行执行时,(粗心的)程序员编写程序时会产生不正确的结果。
https://stackoverflow.com/questions/35626130
复制相似问题