此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炸弹),但为什么呢? (没有输出写入日志文件。)
答案 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
}
但我并不认为这是必要的或有用的。重命名该功能要容易得多。