Bash脚本运行到无限循环。为什么?

时间:2013-02-12 10:36:49

标签: bash infinite-loop nohup

此init脚本应使用带有“start”参数的nohup启动服务。所有其他参数应按原样传递。 (为方便起见,提供了重启。)

#!/bin/sh
# Foo Startup Script

LOGFILE="/var/log/foo/foo.log"
WORKDIR="/usr/local/foo"

nohup() {
        nohup $WORKDIR/bin/foo $@ >> $LOGFILE  2>&1 &
}
other() {
        $WORKDIR/bin/foo $@
}

case "$1" in
  start)
        nohup $@
        ;;
  restart)
        other stop
        nohup start
        ;;
  *)
        other $@
        exit
esac

使用“start”,脚本会进入一个无限循环,nohup分支越来越多的进程(也称为fork炸弹),但为什么呢? (没有输出写入日志文件。)

2 个答案:

答案 0 :(得分:1)

nohup() {
    /usr/bin/nohup $WORKDIR/bin/foo "$@" >> $LOGFILE  2>&1 &
}

答案 1 :(得分:1)

最有可能:

nohup() {
        nohup $WORKDIR/bin/foo $@ >> $LOGFILE  2>&1 &
}

您的函数nohup会自行调用。最简单的解决方案是为函数指定一个不同的名称。

如果您想要花哨,可以尝试预先计算nohup二进制文件的完整路径,或者使用shell内置版本(如果存在):

builtin nohup --help || native_nohup="$(which nohup)"
nohup() {
        if test -z "$native_nohup"; then
                builtin nohup $WORKDIR/bin/foo $@ >> $LOGFILE  2>&1 &
        else
                $native_nohup $WORKDIR/bin/foo $@ >> $LOGFILE  2>&1 &
        fi
}

但我并不认为这是必要的或有用的。重命名该功能要容易得多。