動作するように既存のスクリプトを修正してみました。起動オプションが正しく機能します。 「停止」オプションが機能します(プロセスは正常に終了しますが、奇妙なエラーが発生します。下部の出力を見てください。誰でも助けることができますか?
#!/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=$(pgrep -d' ' kibana)
複数のPIDスペースがある場合に備えてPIDスペースを分離することもできます(これはすべて終了しsu -c "kill $pid"
ました)。
答え2
このエラーを回避するには、その行[: too many arguments
のすべての変数を二重引用符で囲んで文字列に制限することをお勧めします。
たとえば、行39は次のようになります。
export pid=$PIDFILE
次のように変更してみてください。
export pid="$PIDFILE"