ssh root@remotemachine.com '/opt/app/startup.sh'
...
#!/bin/bash
java -jar./app.jar --spring.profiles.active=dev > startup.log &
echo $! >./app.pid
Когда вы запускаете startup.sh
таким образом, рабочий каталог для процесса (в удаленной системе )будет домашним каталогом пользователя root. этот каталог, вероятно, "/" или "/ root" или что-то в этом роде. Ваш сценарий не содержит команд cd
, поэтому он попытается получить доступ к app.jar
, startup.log
и app.pid
в домашнем каталоге root. Вероятно, в домашнем каталоге root нет файла с именем app.jar
, поэтому команда java ничего не делает.
Если вы хотите получить доступ ко всем этим файлам в /opt/app
, вам следует перейти в этот каталог на удаленной системе:
ssh root@remotemachine.com 'cd /opt/app && /opt/app/startup.sh'
В качестве альтернативы вы можете перейти в правильный каталог внутри скрипта:
#!/bin/bash
cd /opt/app || exit 1
java -jar./app.jar --spring.profiles.active=dev > startup.log &
echo $! >./app.pid
Я решил ту же проблему, отредактировав файл ~/.ssh/config, чтобы он содержал:
Host *
ServerAliveInterval 20
TCPKeepAlive no
Мотивация:
TCPKeepAlive no
означает «не отправлять на сервер сообщения проверки активности». Когда установлено противоположное значение TCPKeepAlive yes, клиент отправляет сообщения проверки активности на сервер и требует ответа, чтобы поддерживать завершение соединения . Это обнаружит, если сервер выйдет из строя, перезагрузится и т. д. Проблема в том, что если соединение между клиентом и сервером прерывается на короткий период времени (из-за нестабильного сетевого соединения ), это привести к сбою сообщений поддержки активности, и клиент завершит соединение с «сломанной трубой».
Параметр TCPKeepAlive no
говорит клиенту просто предположить, что соединение по-прежнему работает, пока не будет доказано обратное по запросу пользователя, что означает, что временные разрывы соединения, пока ваш термин ssh бездействует в фоновом режиме, не разорвут соединение.