我在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 ..但是从控制台手动运行如何删除打印出来的那些错误?
感谢。
答案 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)
可靠的bash锁定功能:
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
}