Потеряна консоль при выходе из EC2 ssh

Я запускаю Java-приложение в качестве сервера на EC2. Но когда я теряю соединение ssh, все консольные сообщения также теряются. Когда я перенаправляю все сообщения на > my.log, а затем использую tail -f my.log, я не получаю сообщения e.printstacktrace. Интересно, что я могу сделать.

Есть ли что-то простое, что я могу сделать, чтобы заново войти в ssh, выяснить, с какой консоли java-приложение выдает все сообщения.

Итак, вместо того, чтобы делать java myapp.jar &, я сейчас делаю java myapp.jar, чтобы не терять какие-либо консольные сообщения.

Другой вопрос: есть ли лучшая команда, чем > my.log, которая не пропускает ни одного сообщения из моего приложения, так что я могу войти и выполнить tail -f my.log?

1
задан 15 July 2012 в 11:02

2 ответа

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

В основном tmux выполнит терминал (или набор терминалов) на компьютере. При выполнении его на удаленном сервере можно разъединиться от него без терминальной смерти. Затем, когда Вы входите в систему в снова позже, можно снова соединиться и видеть весь вывод, который Вы пропустили.

Для запуска его в первый раз просто введите

tmux

Затем когда Вы хотите разъединиться, Вы делаете Ctrl-B d (т.е. нажмите Ctrl-B, затем отпустите обе клавиши и затем нажмите d.

Когда Вы входите в систему снова, можно работать

tmux attach

и Вы будете снова соединяться с tmux и видеть весь вывод, который произошел. Обратите внимание, что при случайной потере соединения SSH (говорят, что сеть понижается), tmux будет все еще работать, хотя это может думать, что это все еще присоединено к соединению. Можно сказать tmux отсоединяться от последнего соединения и присоединения к новому соединению путем выполнения

tmux attach -d

На самом деле можно использовать -d опция все время. На серверах у меня есть это в моем .bashrc

alias tt='tmux attach -d'

Таким образом, когда я вхожу в систему, я могу просто ввести tt и повторное прикрепление. Можно пойти один шаг вперед, если Вы хотите и интегрируете команду в псевдоним для ssh. Я выполняю почтовый клиент внутри tmux на сервере, и у меня есть локальный псевдоним:

alias maileo='ssh -t mail.example.org tmux attach -d'

Это делает ssh к серверу и выполняет команду в конце - tmux attach -d -t опция гарантирует, что терминал запущен - если команда предоставляется затем, это не выполняется в терминале по умолчанию. Таким образом, теперь я могу работать maileo на локальной командной строке и подключении к серверу и tmux сессии. Когда я разъединяюсь от tmux, соединение SSH также уничтожается.

Это показывает, как использовать tmux для Вашего определенного варианта использования, но tmux может сделать намного больше, чем это. Это tmux учебное руководство будет учить Вас немного больше, и там существуют еще многие.

3
ответ дан 15 July 2012 в 11:02

У Вас есть несколько проблем, если Вы хотите оставить выполнение процесса, когда Вы разъединяете и видите весь вывод позже.

Получение сообщений об ошибках

Одна проблема с Вашим подходом состоит в том, что Вы только перенаправляете stdout, но не stderr, таким образом, сообщения об ошибках не войдут в файл. Стандартная идиома для перенаправления всего вывода:

java myapp.jar 2>&1 > myapp.log

Это объясняет, что 2> &1 средства и это дает главе и стиху на ударе i/o перенаправление.

Если Вы хотите видеть различие, Вы могли бы сделать

java myapp.jar > myapp.log 2> myapp.err

Выполнение процесса отпуска, когда Вы разъединяетесь

Даже работая в фоновом режиме (путем добавления & к команде), процесс все еще присоединен к терминалу. Когда терминал перестанет работать, все подпроцессы будут уничтожены, включая тех в фоновом режиме.

Для хранения их живыми, Вы можете

  • поддержите терминал несмотря на потерю Вашего соединения при помощи оконечного мультиплексора (см. мой другой ответ или,
  • используйте nohup, который будет поддерживать команду в рабочем состоянии (путем игнорирования SIGHUP).

Для использования nohup, перенаправляя весь вывод к журналу и помещая его в фон, можно просто сделать:

nohup java myapp.jar 2>&1 > myapp.log &

Больше о nohup.

2
ответ дан 15 July 2012 в 11:02

Другие вопросы по тегам:

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