bash работает, но дает ошибки: «

Я попытался изменить существующий скрипт для работы. Стартовый вариант работает отлично. Опция «Стоп» работает (она успешно завершает процесс, но дает некоторые странные ошибки. См. Вывод внизу. Может ли кто-нибудь помочь?

#!/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 

  • Преобразование разрешений в вывод `ls -l` в восьмеричный
  • Как подавить код завершения готовых фоновых заданий
  • Почему я не могу использовать расширение вкладки / автозаполнение переменных оболочки с помощью cd?
  • Автозаполнение: ограничение энтузиазма программы
  • bash с сокращенным текущим режиссером, включая файлы точек?
  • Считать количество вхождений регулярного выражения в круглых скобках
  • Добавить конечную косую черту в завершении bash символьных ссылок каталога
  • Рекурсивная очистка всех папок и подпапок в папке, в которой нет файлов
  • Сценарий Bash для минимизации PNG продолжает останавливаться
  • Откройте несколько файлов в Vim с файловым списком
  • Xdotool с использованием «DISPLAY =: 0» не работает в Crontab
  • Окраска синтаксиса Bash
  • 2 Solutions collect form web for “bash работает, но дает ошибки: «”

     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 расширяется до нескольких слов (пять, в приведенном выше значении), которые не образуют разумного теста, поэтому [ выдает ошибку. Это не имеет особого смысла даже с [ ! -f "$kibana_exec" ] [ ! -f "$kibana_exec" ] поскольку значение в переменной не похоже на имя файла. Кроме того, если вы хотите использовать подстановку команд для запуска программы и захвата того, что она напечатала, вы должны использовать kibana_exec=$(command ...) , но здесь это тоже не сработает, поскольку вы перенаправляете весь вывод на файл журнала.

    Однако я не могу сопоставить номер строки (39) в сообщении об ошибке с скриптом. Насколько я могу судить, строка 39 – это export pid=$PIDFILE , который не похож на ошибку.

    Я не совсем уверен, что именно вы пытаетесь сделать здесь, если kibana_exec держит только имя исполняемого файла ( /data/kibana-main/bin/kibana )? И если да, возможно, вам следует использовать [ -x "$kibana_exec" ] .


    В функции stop() функция kibana_exec выглядит kibana_exec , поэтому [ ! -f $kibana_exec ] [ ! -f $kibana_exec ] будет просто [ ! -f ] [ ! -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, на всякий случай, если их больше одного (так что su -c "kill $pid" убьет их всех).

    Чтобы избавиться от ошибки [: too many arguments , я бы предложил помещать любую переменную в эту строку в двойные кавычки, заставляя ее ограничиваться одной строкой.

    Например, строка 39:

     export pid=$PIDFILE 

    попробуйте изменить его на:

     export pid="$PIDFILE" 
    Linux и Unix - лучшая ОС в мире.