2013-10-17 93 views
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如果确实如此失败,以防止多个运行相同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的,我打算做..但是从控制台手动运行我如何从打印中删除这些错误?

谢谢。

+0

看一看'man lockfile'! –

+0

#man lockfile 未找到或未安装lockfile的手动条目。 运行AIX 7.1 – exxoid

回答

4

你可以改变你的脚本的中间部分是这样的:

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

这样从mkdir的错误信息会被扔掉。同时,该行为是不变,mkdir仍然失败,所以在if条件将评估真实脚本以1

+0

正是我需要的,谢谢。 – exxoid

+1

好的答案,但从技术上讲,'mkdir'仍然会抛出一个错误(我们仍然会得到预期的非零退出代码),但'2>/dev/null丢弃默认的*消息*,我们不关心对于。 –

+1

谢谢@HenkLangeveld你是对的,我也不喜欢那句话。我现在纠正了它。 – janos

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 
}