Скрипт застрял во время чтения строки, когда скрипт выполняется удаленно - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу иметь один сценарий, который запускает службы на другом сервере.

Я проверил, что сценарий работает должным образом на сервере, на котором будет запускаться сервер.

Этоэто код, который запускает службу и отслеживает журнал до тех пор, пока он не будет запущен:

   pkill -f "$1"
   nohup java -jar -Dspring.profiles.active=$PROFILE $1 &

   tail -n 0 -f nohup.out | while read LOGLINE
   do
       echo $LOGLINE
       [[ "${LOGLINE}" == *"$L_LOG_STRING"* ]] && pkill -P $$ tail
   done

Это прекрасно работает, пока я выполняю его с этой машины.

Теперь я хочучтобы вызвать этот скрипт с другого сервера:

#!/usr/bin/env bash
DESTINATION_SERVER=$1
ssh root@$DESTINATION_SERVER /bin/bash << EOF
    echo "Restarting first service..."
    /usr/local/starter.sh -s parameter

    echo "Restarting second service..."
    /usr/local/starter.sh -s parameter2
EOF

Ну, каждый раз, когда я пытаюсь, чтобы скрипт удаленного сервера застревал в цикле while READ.Но, как я уже сказал, когда я выполняю его локально с сервера, он работает нормально, и в моем «не упрощенном сценарии» я не использую какие-либо системные переменные или аналогичные.

Обновление : Я только что попытался еще больше упростить код с помощью следующих строк в первом сценарии:

pkill -f "$1"
nohup java -jar -Dspring.profiles.active=$PROFILE $1 &
tail -n 0 -f nohup.out | sed "/$L_LOG_STRING/ q"

Я бы сказал, что проблема в том, какв "|"через ssh, но я все еще могу найти почему.

1 Ответ

0 голосов
/ 12 апреля 2019

похоже, что проблема заключается в отсутствии интерактивной консоли при выполнении команды ssh, поэтому команда nohup ведет себя странно.

Я мог бы решить ее двумя способами, явно выводя код в файл:

"nohup java -jar -Dspring.profiles.active=test &1 >> nohup.out &"

вместо:

"nohup java -jar -Dspring.profiles.active=test &1&"

Или изменение способа доступа через ssh с добавлением опции tt (только один не работал):

ssh -tt root@$DESTINATION_SERVER /bin/bash << EOF

Но это последнее решение может привести к другим проблемам с каким-либо персонажем, поэтому, если кто-то не предложит другое решение, это мой патч, который заставит его работать.

...