Потеряна консоль при выходе из 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?
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 научит вас немного большему, и есть еще много чего там.
У вас есть несколько проблем, если вы хотите оставить процесс запущенным при отключении и увидеть все результаты позже.
Захват сообщений об ошибках
Одна из проблем вашего подхода заключается в том, что вы перенаправляете только stdout, но не stderr, поэтому сообщения об ошибках не попадают в файл. Стандартная идиома для перенаправления всего вывода:
java myapp.jar 2>&1 > myapp.log
Это объясняет, что означает 2>&1, и дает главу и стих о перенаправлении ввода / вывода bash.
Если вы хотите увидеть разницу, вы можете сделать
java myapp.jar > myapp.log 2> myapp.err
Оставьте процесс запущенным при отключении
Даже работает в фоновом режиме (добавив & к команде), процесс по-прежнему подключен к терминалу. Когда терминал умирает, все подпроцессы будут убиты, включая фоновые.
Чтобы сохранить их в живых, вы можете
- сохранить терминал живым, несмотря на потерю соединения с помощью мультиплексора терминала (см. мой другой ответ или,
- используйте nohup, который будет поддерживать выполнение команды (игнорируя SIGHUP).
Чтобы использовать nohup, перенаправив весь вывод в журнал и поместив его в фоновый режим, вы можете просто сделать:
nohup java myapp.jar 2>&1 > myapp.log &