1

我有一个 bash 脚本,它通过 cron 设置为每 5 分钟运行一次……有时下一个 5 分钟到来,而最后一个仍在运行。当 cron 尝试运行脚本时,如果脚本仍在运行,那么停止脚本的最佳方法是什么?

看起来像在我的 bash 脚本的开头添加类似https://stackoverflow.com/a/12706574/800592的东西会奏效吗?

我不明白代码试图做什么,我的脚本的正确语法是什么?

...
The  third form is convenient inside shell scripts, and is usually used
       the following manner:

       (
         flock -n 9 || exit 1
         # ... commands executed under lock ...
       ) 9>/var/lock/mylockfile
...

也许这样的事情也会起作用?

flock -n -e 200 || exit 1
4

2 回答 2

1

你为什么不尝试这样的事情:

#!/bin/bash
# Check whether lock file exists
if [ -e /tmp/mylockfile ]; then
  echo "Still running, exiting"
  exit
fi

# Create a lock 
touch /tmp/mylockfile

# Do stuff...

# Clean up
rm /tmp/mylockfile

这有点复杂:

#!/bin/bash

# Check whether lock file exists
iter=0
while [ -e /tmp/mylockfile ]; do
  if [ $((iter++)) -ge 60 ]; then
    echo "Timeout, exiting"
    exit
  fi
  sleep 1
done

# Create a lock 
touch /tmp/mylockfile

# Do stuff...

# Clean up
rm /tmp/mylockfile

循环等待 60 秒以删除锁定文件...

于 2013-10-15T13:59:13.567 回答
0

flock从脚本管理文件锁定。命令行参数-n表示如果文件不能被锁定,flock会失败,所以||后面的命令 在这种情况下将被调用。您的示例中的数字9是用于访问在命令末尾定义的文件的文件描述符。您应该使用足够高的数字,以免干扰您在 shell 脚本中使用的其他文件。您可以使用>>><将文件分配给文件描述符。如果您使用>>>将为您创建文件,但您需要写入权限。如果使用<文件必须存在,但只需要读取权限。你写你的脚本代码之后羊群-n 9 || 1号线出口。

于 2013-10-15T14:13:10.113 回答