Выполнение сценария завершилось ошибкой

Я столкнулся с той же ошибкой (Ошибка: ошибка GnuTLS -15: был получен неожиданный пакет TLS.) И бился головой около часа, но потом я Выяснилось, что домашний каталог пользователей ftp, который находился на томе Gluster, не был смонтирован. Смонтированный объем Gluster и проблема решена.

2
23.05.2016, 18:22
2 ответа

Вместо того, чтобы читать hoption , rspid и rspname из stdin во время выполнения скрипта, вы должны использовать их в качестве параметров в командной строке, как и большинство других программ делают. Это звучит сложно, но на самом деле довольно легко использовать встроенные в bash getopts (см. help getopts для краткой информации)

Таким образом вы можете легко протестировать свой скрипт с теми же аргументами. просто используя историю командной строки вашей оболочки (т.е. НЕ нужно вводить одни и те же значения снова и снова) и, что более важно, вы можете легко использовать этот сценарий в других сценариях, просто вызывая его с правильными аргументами.

Вот версия, которая делает это (плюс несколько мелких улучшений. И исправления для цитирования переменных - обратите внимание, как каждый раз, когда я использовал переменную, я заключал ее в двойные кавычки? Вы должен тоже.)

#! /bin/bash

case "$(uname)" in
   Linux) APPPATH='/opt/app/' ;;
   SunOS) APPPATH='/export/home/' ;;
       *) echo "Unknown OS" >/dev/stderr ; exit 1 ;;
esac

HEAPLOGS="$APPPATH/${USER}/applog/heapdump"
THREADLOGS="$APPPATH/${USER}/applog/threaddump"

DAY=$(date +%Y.%m.%d)
NOW=$(date +%Y.%m.%d-%H.%M.%S)
EXPIRE=30

usage() {
  [ -z "$*" ] || printf "%s\n\n" "$@"

  cat <<__EOF__
Usage: $0 <-h|-t|-b> -e <expire> -p <pid> -i <instance>

  -h    Heap-Dump
  -t    Thread-Dump
  -b    Both of above

  -e    Expiry time (defaults to 30)

  -p    PID
  -i    Instance Name

__EOF__

exit 1
}

unset hoption rspid rspname

# process command line options
while getopts 'htbe:p:i:' opt ; do
  case "$opt" in
    h|t|b) [ -z "$hoption" ] && hoption="$opt" || \
           usage "Only use one of -h, -t, or -b"
           ;;

    e) EXPIRE="$OPTARG" ;;

    p) rspid="$OPTARG" ;;
    i) rspname="$OPTARG" ;;

    *) usage ;;
  esac
done

[ -z "$hoption" ] && usage "Must provide one of -h, -t, or -b"
[ -z "$rspid" ] && usage "'-p <PID>' is required"
[ -z "$rspname" ] && usage "'-i <instance>' is required"

case "$hoption" in
  h)  # generate java heapdump
      jmap -dump:format=b,file="${HEAPLOGS}/${rspname}-${NOW}.hprof" "${rspid}"
      chmod 644 "${HEAPLOGS}/${rspname}-${NOW}.hprof"
        ;;

  t) # generate java threaddump
     jstack "${rspid}" > "${THREADLOGS}/${rspname}-${NOW}.log"
     chmod 644 "${THREADLOGS}/${rspname}-${NOW}.log"
     ;;


  b) # generate java heapdump
     jmap -dump:format=b,file="${HEAPLOGS}/${rspname}-${NOW}.hprof" "${rspid}"
     chmod 644 "${HEAPLOGS}/${rspname}-${NOW}.hprof"

     # generate java threaddump
     jstack "${rspid}" > "${THREADLOGS}/${rspname}-${NOW}.log"
     chmod 644 "${THREADLOGS}/${rspname}-${NOW}.log"
     ;;
esac
3
27.01.2020, 21:59

Добавьте строку отладки echo $ {hoption} после ее считывания, чтобы убедиться, что она установлена ​​правильно.
Также помещайте эхо в каждый случай, указывающий, что вы достигли этого случая.

В этом случае, поскольку вы ищете только один символ, я бы использовал чтение в этом способ:

read -r -n 1 hoption

Флаг -n 1 указывает чтению ждать только 1 символ и не ждать новой строки. флаг -r отключает обработку специальных символов. В общем, вы всегда должны использовать -r , если у вас нет явной причины не делать этого - иначе может возникнуть странное поведение.

Я протестировал сценарий, и похоже, что он получает значение hoption, по крайней мере, в моей среде (без каких-либо изменений). Если приведенное выше не решает вашу проблему, какое сообщение об ошибке вы получаете?

1
27.01.2020, 21:59

Теги

Похожие вопросы