작동하도록 기존 스크립트를 수정해 보았습니다. 부팅 옵션이 제대로 작동합니다. "중지" 옵션이 작동합니다(프로세스가 성공적으로 종료되지만 이상한 오류가 발생합니다. 하단의 출력을 살펴보십시오. 누구든지 도와줄 수 있습니까?
#!/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
자체를 일치시킬 수 있으므로 최종 출력에는 두 줄로 나누어진 두 개의 PID가 있습니다. pid
를 실행할 때 su -c "... $pid"
에 의해 시작된 셸에 su
두 줄이 표시되고 두 번째 줄에는 두 번째 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"