首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Shell脚本以及如何避免在Linux机器上同时运行相同的脚本

Shell脚本以及如何避免在Linux机器上同时运行相同的脚本
EN

Stack Overflow用户
提问于 2014-11-24 09:13:52
回答 6查看 3K关注 0票数 5

我有Linux集中服务器-Linux5.X。

在某些情况下,在我的Linux服务器上,get_hosts.ksh脚本可以从其他一些不同的主机上运行。

例如,get_hosts.ksh可以在我的Linux机器上同时运行三次或更多次。

我的问题是:

  • 如何避免运行多个进程/脚本实例?
EN

回答 6

Stack Overflow用户

发布于 2014-11-24 09:21:10

*nix系统上问题的一个常见解决方案是检查是否存在锁文件。

通常锁文件包含当前进程PID。

这是一个示例ksh脚本:

代码语言:javascript
运行
复制
#!/bin/ksh

pid="/var/run/get_hosts.pid"
trap "rm -f $pid" SIGSEGV
trap "rm -f $pid" SIGINT

if [ -e $pid ]; then
    exit # pid file exists, another instance is running, so now we politely exit
else
    echo $$ > $pid # pid file doesn't exit, create one and go on
fi

# your normal workflow here...

rm -f $pid # remove pid file just before exiting
exit

更新:响应OP注释,我使用trap命令添加处理程序中断和分段错误的内容。

票数 5
EN

Stack Overflow用户

发布于 2014-11-24 09:20:09

通常的方法是将进程id写入文件中。脚本所做的第一件事是检查文件是否存在,读取pid,检查带有pid的进程是否存在,以及是否存在额外的偏执点,如果该进程实际运行脚本。如果是,脚本就会退出。

下面是一个简单的例子。所讨论的进程是二进制文件,此脚本确保二进制文件只运行一次。这并不完全是您所需要的,但是您应该能够适应这样的情况:

代码语言:javascript
运行
复制
RUNNING=0
PIDFILE=$PATH_TO/var/run/example.pid
if [ -f $PIDFILE ]
then
  PID=`cat $PIDFILE`
  ps -eo pid | grep $PID >/dev/null 2>&1
  if [ $? -eq 0 ]
  then
      RUNNING=1
  fi
fi
if [ $RUNNING -ne 1 ]
then
    run_binary
    PID=$!
    echo $PID > $PIDFILE
fi

这不是很详细,但应该让你走上正确的轨道。

票数 3
EN

Stack Overflow用户

发布于 2014-11-24 09:25:09

您可以使用pid文件来跟踪进程何时运行。在脚本的顶部,检查pid文件是否存在,如果它不存在,创建它并运行脚本,否则返回。

在这个对类似问题的回答中可以看到一些示例代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27101283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档