bash 脚本可以工作,但给出错误:“

bash 脚本可以工作,但给出错误:“

我尝试修改现有脚本以使其工作。启动选项工作正常。 “停止”选项有效(它确实成功终止了进程,但给出了一些奇怪的错误。请查看底部的输出。有人可以帮忙吗?

#!/bin/sh  
# ckconfig: 35 99 1  
### BEGIN INIT INFO  
# Provides: kibana
# Required-Start: $syslog $network $named $remote_fs $time networker
# Required-Stop: $syslog
# Should-Start: $ALL
# Should-Stop: $ALL
# Default-Start: 3 5
# Default-Stop: 0 6
# Description: Start the kibana application
### END INIT INFO

SCRIPT_NAME="$0"  
SERVICE_NAME="kibana"  

usage()  
{  
    echo "USAGE: kibana start|stop" 1>&2  
    exit 1  
}  
start()
{
        export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
        export kibana_parms="&"
        if [ ! -f $kibana_exec ]; then
                echo "kibana ERROR"
                RETVAL=1
                return 1
        fi
        /bin/su - Delk_admin_dev -c "$kibana_exec $kibana_parms 2>&1"
        RETVAL=$?
        return $RETVAL
}

stop()
{
        export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
        export pid=$PIDFILE
        if [ ! -f $kibana_exec ]; then
                echo "kibana ERROR"
                RETVAL=1
                return 1
        fi
        /bin/su - Delk_admin_dev -c "kill -15 $pid"
        RETVAL=$?
        return $RETVAL
}


case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        *)
                /bin/echo $"Usage: kibana {start|stop}"
                ;;
esac

exit $?

[Delk_admin_dev@pvmdlr001 ~]$ ./newbash stop
./newbash: line 39: [: too many arguments
Password:
-bash: line 1: 8197: command not found

答案1

export kibana_exec="nohup /data/kibana-main/bin/kibana > /data/logs/kibana/kibana.log 2>&1 "
if [ ! -f $kibana_exec ]; then

这看起来像是会给出[: too many arguments错误的东西:$kibana_exec扩展为多个单词(上面给出的值中的五个),这不形成合理的测试,因此[会引发错误。即使这样也没有多大意义,[ ! -f "$kibana_exec" ]因为变量中的值看起来也不像文件名。另外,如果您打算使用命令替换来运行程序并捕获它打印的内容,您可以使用kibana_exec=$(command ...),但在这里这也不起作用,因为您将所有输出重定向到日志文件。

但是,我无法将错误消息中的行号 (39) 与脚本匹配。据我所知,第 39 行是export pid=$PIDFILE,它看起来不应该给出错误。

我不太确定你想在这里做什么,应该kibana_exec只保存可执行文件的名称(/data/kibana-main/bin/kibana)?如果是这样,也许你应该使用[ -x "$kibana_exec" ].


stop()函数中,kibana_exec看起来未设置,因此[ ! -f $kibana_exec ]将只是进行[ ! -f ]哪些测试以查看是否-f为空。事实并非如此,因此条件部分永远不会运行。

export PIDFILE="`(ps -eaf | grep kibana | awk '{print $2}')`"
export pid=$PIDFILE

这里,grep可能匹配输出中的多行ps,即kibanagrep本身,因此最终输出有两个 PID,分两行。这些被设置为pid,当您运行 时su -c "... $pid",由 启动的 shellsu会看到两行,第二行只有第二个 PID。它尝试将其作为命令运行,但没有找到它,并且您会得到类似的内容8197: command not found。错误消息中提到line 1的显然不是完整脚本的第一行,因此这也暗示它来自脚本内生成的另一个 shell。

类似的东西pid=$(pgrep kibana)可能会更好(pgrep不会匹配自身),或者pid=$(pgrep -d' ' kibana)将 PID 空间分开,以防万一有多个(这样su -c "kill $pid"会杀死它们)。

答案2

为了消除该[: too many arguments错误,我建议将该行上的任何变量放在双引号中,强制将其限制为一个字符串。

例如第 39 行是:

export pid=$PIDFILE

尝试将其更改为:

export pid="$PIDFILE"

相关内容