3

我在shell脚本中有一段代码如下..

    run_checks()
    {
    # Check if program is already running
    if ! mkdir /tmp/aisync.lock; then
      printf "Failed to aquire lock.\n" >&2
      exit 1
    fi
    trap 'rm -rf /tmp/aisync.lock' EXIT
    }

它基本上检查 aisync.lock 是否存在,如果存在则失败,以防止同一 shell 脚本的多个实例运行。

但是,如果我从控制台运行它,我会得到..

    # syncai.sh
    mkdir: 0653-358 Cannot create /tmp/aisync.lock.
    /tmp/aisync.lock: Do not specify an existing file.
    Failed to aquire lock.

有没有办法避免错误?

    mkdir: 0653-358 Cannot create /tmp/aisync.lock.
    /tmp/aisync.lock: Do not specify an existing file.

所以当我从命令行运行它时它看起来更干净。我知道如果我 cron 它我可以将所有内容发送到我打算做的 /dev/null 。但是从控制台手动运行我怎样才能从打印出来?

谢谢。

4

2 回答 2

3

您可以像这样更改脚本的中间部分:

if ! mkdir /tmp/aisync.lock 2>/dev/null; then
  printf "Failed to aquire lock.\n" >&2
  exit 1
fi

这样,来自的错误消息mkdir将被丢弃。同时行为没有改变,mkdir仍然失败,所以 中的条件if将评估为真,脚本将以 1 退出。

于 2013-10-17T19:49:08.777 回答
0

可靠的锁定功能:

LOCK()
{
    LOCKDIR="/tmp/${0##*/}-lock-$1"
    PIDFILE="${LOCKDIR}/PID"

    if mkdir "${LOCKDIR}" &>/dev/null; then
            echo "$$" >"${PIDFILE}"
            trap 'rm -rf "${LOCKDIR}"' 0
            trap 'echo "killed by a signal." >&2; exit' 1 2 3 15
    else
            OTHERPID="$(cat "${PIDFILE}")"
            if ! kill -0 $OTHERPID &>/dev/null; then
                    echo "removing stale lock of nonexistant PID ${OTHERPID}" >&2
                    rm -rf "${LOCKDIR}"
                    exit
            fi
    fi
}
于 2013-10-18T21:07:22.630 回答