Перенос текущей команды в отсоединяемый сеанс (tmux / screen)

41

В настоящее время я выполняю резервное копирование, и теперь его нужно перенести на съемный, например, на tmuxили screen. Есть ли способ сделать это, когда команда в данный момент выполняется?

Я могу отправить команду фону, нажав Ctrl+, Zи вернуть ее обратно, введя fgкоманду. но я не знаю, может ли эта сессия вернуться, когда я выхожу из терминала.

Юрген Пауль
источник
1
Нет способа сделать это. Вы должны запустить команду из экранной (или другой) сессии, чтобы ее можно было отсоединить.
Дэн Д.

Ответы:

45

Это работает, в большинстве случаев:

Пререквизиты: есть reptyrи tmux/ screenустановлены; Вы сможете найти их с apt-getили yum, в зависимости от вашей платформы.

  1. Используйте Ctrl+, Zчтобы приостановить процесс.

  2. Возобновите процесс в фоновом режиме с bg

  3. Найдите идентификатор процесса фонового процесса с помощью jobs -l

    Вы увидите нечто похожее на это:

    [1]+ 11475 Stopped (signal) yourprocessname
    
  4. Отключить работу от текущего родителя (оболочки) с disown yourprocessname

  5. Начало tmux(предпочтительно) или screen.

  6. Снова подключите процесс к tmux/ screenсеансу с reptyr:

    reptyr 11475
    
  7. Теперь вы можете отсоединить мультиплексор (по умолчанию Ctrl+ B, Dдля tmuxили Ctrl+ A, Dдля screen) и отключить SSH, пока ваш процесс продолжается в tmux/ screen.

  8. Позже, когда вы снова подключитесь к SSH, вы сможете подключиться к мультиплексору (например tmux attach).

Виль
источник
2
К сожалению, после запуска sudo reptyr 1430я все еще получал: «... [-] Невозможно открыть tty у ребенка. Невозможно прикрепить к pid 1430: В доступе отказано»
Дэрил Спитцер
3
Вы можете достичь успеха с опцией -L, например, reptyr -L 1430 в вашем случае.
cgseller
1
Запустите это, когда это необходимо:echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Yanhao
это также на Arch через йо: archlinux.org/packages/community/i686/reptyr (не apt-get или yum)
Томми
1
После bgэтого процесс должен быть запущен в фоновом режиме, так jobsсказать, Runningа не Stopped.
G-Man говорит: «Восстановите Монику»
2

reptyr это хорошо, но я получил ошибку разрешения

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Потом нашел
-L Like '-l', but also redirect the child's stdio to the slave.

который работал как шарм

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
фифи финанс
источник
2
Когда я добавил, -Lя получил сообщение, похожее на ваше, Opened a new pty: /dev/pts/6но мое отстраненное topне появилось в tmux. что мне здесь не хватает?
Мехрад Махмудян
-1

Вы можете использовать disown, чтобы отсоединить задание от его терминала, если эта команда доступна.

для начала безопаснее запустить его с nohup.

johnshen64
источник
Можете ли вы расширить это? Что вы хотите начать с этого nohup? Как работает disowningпроцесс?
Дарт Андроид
disown отсоединяет фоновый процесс (который вы помещаете в фон с помощью control-z) от терминала, поэтому процесс будет продолжаться после того, как терминал исчезнет. Вы можете просто ввести disown после control-z, если команда найдена. однако это теоретически и может не работать надежно. в следующий раз безопаснее, добавив nohup в начало вашей программы, чтобы вы могли безопасно выйти из терминала.
johnshen64
Как я уже упоминал, «отречение» было довольно ненадежным. Нохуп на самом деле не намного лучше. Reptyr может быть решением, однако. github.com/nelhage/reptyr
анастрофа
Это не отвечает на вопрос. Вопрос не только в том, «как закрыть терминал без уничтожения резервной копии», но и в том, «как возобновить его позже». На что правильный ответ «ты не можешь».
Гейб
Я вижу здесь возможное семантическое несогласие, и это довольно популярный результат поиска по таким ключевым словам, как «перемещаемый», «независимый от позиции», «отключить tmux» и т. Д., Поэтому я надеюсь, что вы можете простить некропост. Вы имели в виду «вы не можете» из-за различий в отображении памяти между остановкой программы и ее возобновлением? Программа резервного копирования будет знать только, какие файлы для резервного копирования, по файловой структуре, которую она предоставила, и файловая структура существует, чтобы сделать эту физическую память сопоставимой в будущем. (Мы поддерживаем то, что это не так!)
Джон П