lsof linux命令用于计算带有参数值的运行实例

时间:2017-05-24 06:28:59

标签: linux bash shell lsof

我使用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

2 个答案:

答案 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的输出和继续之间存在竞争条件。如果两个进程几乎同时启动,那么它们可能会并行运行。