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, 즉 kibanagrep자체와 일치할 수 있으므로 최종 출력에는 두 줄에 두 개의 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"

관련 정보