如何避免shell脚本执行中的命令错误

时间:2013-10-17 19:42:21

标签: bash shell ksh

我在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 ..但是从控制台手动运行如何删除打印出来的那些错误?

感谢。

2 个答案:

答案 0 :(得分:4)

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

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

这样,来自mkdir的错误消息将被丢弃。同时行为保持不变,mkdir仍然失败,因此if中的条件将评估为true,脚本将以1退出。

答案 1 :(得分: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
}