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は複数の単語 (上記の値では 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 foundline 1エラー メッセージで参照されている は、完全なスクリプトの最初の行ではないことは明らかです。そのため、これは、スクリプト内で生成された別のシェルからのものであるというヒントとしても機能します。

のようなものの方pid=$(pgrep kibana)が良いかもしれません (それ自体はpgrep一致しません)。または、PID がpid=$(pgrep -d' ' kibana)複数ある場合に備えて、スペースで区切って PID を取得します (その場合、su -c "kill $pid"すべて削除されます)。

答え2

エラーを解消するには[: too many arguments、その行の変数を二重引用符で囲み、1 つの文字列に制限することをお勧めします。

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

export pid=$PIDFILE

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

export pid="$PIDFILE"

関連情報