6

У меня есть файл, открытый в vi работающий в терминале (xterm), если я непосредственно закрываю терминал, не закрыв сначала файл, я вижу, что vi все еще работает в фоновом режиме (ps x). Есть ли способ присоединить этот процесс, например, vi, к другому терминалу, чтобы я мог продолжить работу над файлом. Я также попробовал команду fd но она не удалась.

4 ответа4

3

Это невозможно "чисто". Существуют такие инструменты, как screen и tmux, которые создают постоянный виртуальный терминал: вы можете запустить свою программу внутри экрана, отключить сеанс экрана, а затем снова присоединить сеанс экрана к другому терминалу. Но это требует планирования заранее.

Можно использовать ptrace для работы с файловыми дескрипторами процесса, чтобы повторно подключить их к другому терминалу. Это не работает надежно, потому что это может создать несоответствия в структурах данных процесса: некоторые программы не будут возражать, другие будут аварийно завершать работу. Вы можете сделать это, подключив программу в отладчике и выполнив правильную последовательность системных вызовов (по крайней мере, open , dup и close для каждого из стандартного ввода, стандартного вывода и стандартной ошибки). Есть несколько существующих инструментов, которые могут сделать это, например, neercs и retty.

См. Также Как я могу приостановить запущенный процесс через ssh, отречься от него, связать его с новой оболочкой экрана и отменить его?, Просмотреть сценарий через SSH?, Могу ли я nohup/screen уже запущенный процесс?, Возобновить выполнение команды в отброшенном сеансе SSH.

1

Вы можете попробовать экран GNU. Это сделано для этого.

Screen - это полноэкранный оконный менеджер, который мультиплексирует физический терминал между несколькими процессами, обычно это интерактивные оболочки.

0

Вы можете использовать GDB для присоединения запущенного процесса к терминалу.

Вот описание, разбросанное по нескольким ответам на вопрос (особенно см. Ответ Мирека):

https://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line

-1

Нет способа сделать это. Просто убей оторванный процесс. Если вы хотите сделать это намеренно, взгляните на команду «screen». Это не спасет вас, если ваша основная оболочка умрет.

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