我尝试修改现有脚本以使其工作。启动选项工作正常。 “停止”选项有效(它确实成功终止了进程,但给出了一些奇怪的错误。请查看底部的输出。有人可以帮忙吗?
#!/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
,即kibana
和grep
本身,因此最终输出有两个 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"