首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果同一个脚本的另一个实例已经在运行,是否可以执行shell脚本?

如果同一个脚本的另一个实例已经在运行,是否可以执行shell脚本?
EN

Stack Overflow用户
提问于 2016-02-25 11:34:57
回答 3查看 820关注 0票数 0

我有一个shell脚本,它通常在一次运行中运行近10分钟,但是我需要知道是否在脚本的一个实例已经运行时出现了另一个运行脚本的请求,新的请求是否需要等待现有实例来完成,还是将启动一个新的实例。

我需要一个新的实例必须启动时,一个请求是可用的相同的脚本。

怎么做..。

shell脚本是一个轮询脚本,它在目录中查找一个文件并执行该文件的file.The,执行过程中需要将近10分钟,如果一个新文件到达,它也必须同时执行。

shell脚本如下所示,以及如何修改它以执行多个请求。

代码语言:javascript
复制
#!/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
EN

回答 3

Stack Overflow用户

发布于 2016-02-25 13:05:35

在编写像您描述的脚本时,我采用两种方法之一。

首先,您可以使用pid文件来指示第二个副本不应该运行。例如:

代码语言:javascript
复制
#!/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:

代码语言:javascript
复制
#!/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系统,您可能有足够的能力同时处理多个队列条目。

票数 2
EN

Stack Overflow用户

发布于 2016-02-25 13:17:35

如果修改脚本是一个选项,ghoti's answer将展示一些有用的技术。

一般来说,对于现有的脚本:

除非你确信:

  • 除了输出到终端或写入具有shell实例特定名称的文件(例如将当前shell的PID $$合并到文件名)或其他特定于实例的位置外,脚本没有其他副作用,
  • 或者脚本是为并行执行明确设计的,

我假设您不能安全地同时运行多个脚本副本。

期望平均shell脚本设计为并发使用是不合理的。

票数 1
EN

Stack Overflow用户

发布于 2016-02-25 12:44:52

从操作系统的角度来看,当然有几个进程可以并行执行相同的程序。不用担心这个。

然而,可以想象的是,当两个副本并行执行时,(粗心的)程序员编写程序时会产生不正确的结果。

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

https://stackoverflow.com/questions/35626130

复制
相关文章

相似问题

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