Иногда мой оконный менеджер 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 изменяется после каждой команды).

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

1 ответ1

1

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

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

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

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

Более удобное решение - использовать tmux или screen .

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

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

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

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

Скриншот

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .