既存のスクリプトを修正して動作させようとしました。開始オプションは正常に動作します。「停止」オプションは動作します (プロセスは正常に終了しますが、奇妙なエラーが発生しました。下部の出力を参照してください。どなたか助けていただけませんか?
#!/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"
によって起動されたシェルはsu
2 行を認識し、2 行目には 2 番目の PID のみが含まれます。シェルはこれをコマンドとして実行しようとしますが、見つからないため、 のようなものが表示されます8197: command not found
。line 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"