【问题标题】:How can I avoid multiple starting of a bash script?如何避免多次启动 bash 脚本?
【发布时间】:2013-07-07 19:44:10
【问题描述】:

我编写了一个名为“wp”的小 bash 脚本,它将文件上传到 ftp 服务器。它使用 wput 实用程序。它从文本文件中获取文件列表。当上传准备好时,它会在文本文件中用双叉号划出一行。根据日志文件的最后一行检测上传是否成功。我的问题是如何避免多次启动我的脚本?我正在尝试使用 pgrep 检测实例是否正在运行,但无法正常工作:

#!/bin/bash

if [ "$(pgrep ^wp$|wc -l)" -eq "2" ]

then 
  echo "$(pgrep ^wp$)"
  echo "$(pgrep ^wp$|wc -l)"
  echo "wp script is starting..."
else 
  echo "$(pgrep ^wp$)"
  echo "$(pgrep ^wp$|wc -l)"
  echo "wp script is already running!"
  exit
fi

server="ftp://username:password@ftp.ftpserver.com"
logfile=~/uploads.log
listfile=~/uploads.txt
list_backup=~/uploads_bak000.txt

while read f;
do
 ret=""

 if [ "${f:0:1}" = "#" -o "$f"1 = 1 ] 
 then
  if [ "$f"1 = 1 ] 
  then
   :
   #echo "invalid string: "$f
  else
   #first character is remark sign # then empty command -> :
   echo "remark line skipped: "$f 
  fi
 else
  #while string $ret is empty
  while [ -z "$ret" ]
  do
   wput "$f" --tries=-1 "$server" 2>&1|tee -a $logfile #> /dev/null
   ret=$(tail -n 1 "$logfile"|grep "FINISHED\|Nothing\|Skipped\|Transfered")
  done
  if [ -n "$ret" ]
  then
   cat $listfile > $list_backup
   awk -v f="$f" '{if ($0==f && $0!~/#/) print "#" $0; else print $0;}' $list_backup > $listfile
  fi
 fi 
done < $listfile

【问题讨论】:

    标签: bash ftp awk instance


    【解决方案1】:

    有一些使用 ps 和 grep 的 quick-n-dirty 解决方案(不要这样做)。

    最好将锁定文件用作“互斥体”。一个很好的方法是将目录用作锁定文件 (http://mywiki.wooledge.org/BashFAQ/045)。

    我还建议看看: http://mywiki.wooledge.org/ProcessManagement#How_do_I_make_sure_only_one_copy_of_my_script_can_run_at_a_time.3F ,其中提到使用 setlock(http://cr.yp.to/daemontools/setlock.html) 为您抽象锁定文件处理。

    【讨论】:

    • 谢谢,在 /tmp 中创建一个 emtpy 目录解决了这个问题。我认为它必须在我的脚本末尾删除,但是如果我的脚本被 Ctrl+C 中止并且我想重新启动它会发生什么?由于存在锁定目录,它不会启动。
    • @Konstantin,你需要阅读 BashFAQ 链接,答案就在那里。
    • @Konstantin:您需要使用 trap 命令确保 rm 在捕获信号后执行。但正如 Glenn 所说:请阅读 BashFAQ 的其余部分。它包括其他宝石,例如一个很好的解释,为什么您会选择 mkdir 而不是其他方法,提到需要考虑的剩余陈旧锁定风险(在 kill -9 的情况下)和 flock 如果您可以使用在 linux 上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多