我使用lsof命令只运行一个setup.sh实例,如果没有参数值,它可以正常工作。但是,我需要在setup.sh中传递参数,例如。
setup.sh machine1 setup.sh machine2 setup.sh machine3
因此,如果setup.sh machine1正在运行并且同样的命令再次运行,它将等到setup.sh machine1完成。我认为lsof是针对流程的,可能是不可能的,但是等待逻辑的任何其他好建议?
当我尝试传递一些参数时,lsof命令会出现语法错误,我尝试下面但没有运气。我的目的是使用machine1只运行一个实例,如果有人尝试使用machine1参数运行setup.sh,那么它应该等待。还有其他文件锁定/等待逻辑吗?
if ( [[ $(lsof -t \setup.sh 'machine1'| wc -l) > 1 ]] ); then
if ( [[ $(lsof -t '\setup.sh machine1'| wc -l) > 1 ]] ); then
if ( [[ $(lsof -t "\setup.sh machine1"| wc -l) > 1 ]] ); then
if ( [[ $(lsof -t \setup.sh| wc -l) > 1 ]] ); then
echo -e "\tWaiting for 2 minutes...\n"
sleep 2m
else
echo -e "\tFree now to run setup.sh\n"
fi
if ( [[ $(lsof -t \setup.sh machine1| wc -l) > 1 ]] ); then
echo -e "\tWaiting for 2 minutes...\n"
sleep 2m
else
echo -e "\tFree now to run setup.sh\n"
fi
答案 0 :(得分:0)
您可以使用ps -eo args
搜索带有参数的进程,如下所示。
ps -eo args | grep '^setup.sh machine1' | wc -l
您需要更改grep模式以适合您的情况。
答案 1 :(得分:0)
Greg的Wiki有一篇关于流程管理的精彩文章,特别是" How do I make sure only one copy of my script can run at a time?"。 lsof
不是保证只有一个进程正在运行的可靠方法,因为在检查lsof
的输出和继续之间存在竞争条件。如果两个进程几乎同时启动,那么它们可能会并行运行。