bashスクリプトは機能しますが、エラーが発生します:「[:あまりにも多くの引数」と「8197:コマンドが見つかりません」

bashスクリプトは機能しますが、エラーが発生します:「[:あまりにも多くの引数」と「8197:コマンドが見つかりません」

動作するように既存のスクリプトを修正してみました。起動オプションが正しく機能します。 「停止」オプションが機能します(プロセスは正常に終了しますが、奇妙なエラーが発生します。下部の出力を見てください。誰でも助けることができますか?

#!/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複数の単語(上記の値の5つ)に拡張すると、合理的なテストが形成されないため、[エラーが発生します。[ ! -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自体を一致させることができるため、最終出力には2行に分割された2つのPIDがあります。pidを実行すると、起動su -c "... $pid"したシェルにsu2行が表示され、2行目には2番目のPIDのみが表示されるように設定されます。コマンドで実行しようとしましたが、見つからず、次のような結果が得られます8197: command not found。エラーメッセージに記載されているのはline 1明らかにスクリプト全体の最初の行ではないため、これはスクリプト内で生成された他のシェルからのものです。

このような方がpid=$(pgrep kibana)良いかもしれません(pgrep自己一致しない)、pid=$(pgrep -d' ' kibana)複数のPIDスペースがある場合に備えてPIDスペースを分離することもできます(これはすべて終了しsu -c "kill $pid"ました)。

答え2

このエラーを回避するには、その行[: too many argumentsのすべての変数を二重引用符で囲んで文字列に制限することをお勧めします。

たとえば、行39は次のようになります。

export pid=$PIDFILE

次のように変更してみてください。

export pid="$PIDFILE"

関連情報