0

此初始化脚本应使用带有“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 炸弹),但为什么呢?(没有输出写入日志文件。)

4

2 回答 2

1
nohup() {
    /usr/bin/nohup $WORKDIR/bin/foo "$@" >> $LOGFILE  2>&1 &
}
于 2013-02-12T10:51:22.963 回答
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
}

但我真的不认为这是必要或有用的。重命名函数要容易得多。

于 2013-02-12T10:55:14.657 回答