Как удаленно завершить процессы оболочки bash, но сохранить историю?

385
meowsqueak

Иногда мой оконный менеджер X11 (i3) блокируется, и я вынужден переключиться на виртуальную консоль Linux или SSH на мою машину, чтобы восстановить контроль.

Обычно это происходит, когда у меня открыто множество окон rxvt, в каждом из которых запущена оболочка bash, содержащая десятки, если не сотни строк полезной истории командной строки, собранной за многие дни или недели.

Я использую shopt -s histappendтак, чтобы каждая оболочка bash добавляла свою историю в файл истории, когда она завершается упорядоченным образом. Обычно это работает очень хорошо и сохранит всю мою историю, если я аккуратно закрою каждую оболочку с помощью exitили CTRL-D.

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

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

Я попытался перезапустить i3, но по разным причинам это не работает (сломанный RPC сокет, кажется). Убийство оконного менеджера закрывает все окна и оболочки bash, и я теряю историю от всех них.

Я пытался найти способ ввести «CTRL-D» в каждую оболочку stdin, но, насколько я могу судить, это невозможно.

Я знаю способы заставить bash сохранять историю в файле истории после каждой команды, но я предпочитаю не использовать их, поскольку они портят индексы истории (то !nnnесть не работают, потому что nnnменяются после каждой команды).

Есть ли способ сделать это и спасти мою драгоценную историю от определенного забвения?

0

1 ответ на вопрос

1
Kamil Maciorowski

Используйте reptyr.

reptyr утилита, которая берет существующую работающую программу и присоединяет ее к новому терминалу.

Смотрите этот мой ответ для деталей. После того, как вы прикрепите желаемый процесс оболочки к вашему текущему терминалу, вы можете сказать это exitизящно.

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

Более удобным решением является использование tmuxили, screenв первую очередь, использование.

Я работаю с ним tmuxкаждый день, и присоединить его к tty2 - тривиальная задача. С инструментом мне не нужно "открывать многочисленные окна rxvt". Обычно я организую свою работу так:

  1. Единое konsoleокно.
  2. Одна вкладка на машину (локальный хост, плюс I sshна несколько удаленных), tmuxна каждой.
  3. Внутри каждого tmuxокна или более (при необходимости).
  4. Внутри каждого окна одна панель или более (по необходимости).

Эти «слои» отмечены соответствующими красными цифрами на скриншоте ниже. Проблемы X11 или KDE не влияют на мои сессии оболочки, если я могу получить доступ к любой консоли данного компьютера. Только разрушение самого tmuxсервера может повредить, но я не могу вспомнить, когда в последний раз такое случалось со мной (вероятно, никогда).

В случае, если «я вынужден переключиться на виртуальную консоль Linux или SSH на свою машину, чтобы восстановить контроль», все, что мне нужно, - это вернуть tmux aсеанс оболочки обратно, полностью работоспособный, как будто ничего не произошло. Если я могу заставить мой менеджер окна, чтобы перезагрузить, то я даже не нужно прекратить эти процессы оболочки, потому что я могу вернуться к ним с новым konsole, rxvtили любым эмулятора терминала.

screenshot

Большое спасибо за эту информацию. `reptyr` это именно то, что мне нужно. Раньше я все время использовал `screen`, но я обнаружил, что копирование / вставка и прокрутка ведут себя как ограничитель шоу - разве` tmux` справляется с этой задачей лучше? meowsqueak 5 лет назад 0
Кстати, хотя я мог бы использовать `tmux` для спасения моих сессий bash, если я уже использовал его, когда я выключал i3, вся моя машина зависала (возможно, проблема с видеодрайвером), так что это тоже не было бы идеально, если бы я не инструктировал каждую оболочку сначала сохранять историю :) meowsqueak 5 лет назад 0
@meowsqueak Честно говоря, я не знаю, лучше ли работает `tmux`. У меня нет опыта работы с `screen`, поэтому нет сравнения; и мне почти никогда не нужно копировать из `tmux`. Kamil Maciorowski 5 лет назад 0

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