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"

相關內容