3

次のように、シェルスクリプトにコードブロックがあります..

    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 が存在するかどうかをチェックし、存在する場合は失敗して、同じシェル スクリプトの複数のインスタンスが実行されるのを防ぎます。

ただし、コンソールからこれを実行すると、..

    # 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まだ失敗するため、 の条件はiftrue と評価され、スクリプトは 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 に答える