it-swarm-ru.tech

Как я могу отречься от запущенного процесса и связать его с новой оболочкой экрана?

У меня есть работающая программа на SSH Shell. Я хочу приостановить его и быть в состоянии остановить его выполнение, когда я вернусь.

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

Есть ли другой способ продолжить?

164
levesque

Использование GNU screen - ваш лучший выбор.

Начальный экран запускается при первом входе в систему - я запускаю screen -D -R, введите команду и отключите или приостановите ее с помощью CTRL-Z и ​​затем отключитесь от экрана, нажав CTRL-A затем D.

При повторном входе в систему снова подключитесь, запустив screen -D -R. Вы будете в той же оболочке, что и раньше. Вы можете запустить jobs, чтобы увидеть приостановленный процесс, если вы это сделали, и запустить %1 (или соответствующее задание #), чтобы снова поставить его на передний план.

88
Andrew Yochum

Вы можете отменить "владение" программой из командной консоли с помощью встроенного в disown :

# press Ctrl+Z to suspend the program
bg
disown

Однако это только говорит Shell, чтобы она не отправляла сигнал SIGHUP программе при выходе из Shell. Программа сохранит любое соединение с терминалом, как правило, в виде стандартных потоков ввода, вывода и ошибок. Нет возможности подключить их к другому терминалу. ( Экран работает путем эмуляции терминала для каждого окна, поэтому программы прикрепляются к окну экрана.)


Можно повторно присоединить файловые дескрипторы к другому файлу, подключив программу в отладчике (т.е. используя ptrace ) и заставив ее вызвать open, dup и ​​close. Есть несколько инструментов, которые делают это; это сложный процесс, и иногда они могут привести к сбою процесса. Возможности включают (ссылки, собранные из ответов на Как я могу отречься от запущенного процесса и связать его с новой экранной оболочкой? и Могу ли я Nohup/просмотреть уже запущенный процесс? знак равно

116
Gilles 'SO- stop being evil'

Для перемещения процесса между терминалами или для повторного подключения отключенного, вы можете использовать, например, reptyr .

67
jofel

Мое любимое решение - использовать tmux, вы можете отсоединить сеанс и повторно подключить его в другом терминале.

Когда вы отсоединились от предыдущего сеанса, вы можете безопасно закрыть терминал; позже использовать tmux attach, чтобы вернуться к сеансу, даже если вы вышли из системы.

28
daisy

Также есть небольшая утилита под названием retty , которая позволяет вам снова подключить запущенные программы к другому терминалу.

21
adamg

Я не использую это регулярно, но neercs утверждает, что поддерживает это. Это screen-подобная программа с различными необычными функциями, такими как улучшенное управление панелями, но главное, что она предлагает, это возможность импортировать процесс в панель

19
Michael Mrozek

Если вы просто хотите приостановить его и перезапустить после этого, вы можете использовать kill с сигналом STOP или CONT.

Сначала выясните процессы PID с

$ ps aux

Затем отправьте сигналы этому PID, указанному в процессе

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

"injcode" от ThomasHabets, кажется, именно то, что мне нужно:

https://github.com/ThomasHabets/injcode

Программа injcode позволяет вводить произвольный код в работающий процесс, вне зависимости от того, знали ли вы заранее и работали screen или tmux

От README:

Пример 1: переместить irssi из одного терминала в другой

Может быть, переместить его в экран.

Сначала запустите irssi в одном терминале.

Запустите injcode в другом терминале: $ injcode -m retty

Irssi теперь должен быть перенесен на второй терминал, включая новый управляющий терминал.

9
user2688272

Это сработало для меня:

  1. bg процесс
  2. jobs -l найти номер процесса
  3. tmux запустить менеджер окон оболочки
  4. reptyr -L PROCESSNUMBER

reptyr 's -L необходимо было заставить это работать:

-L Like '-l', but also redirect the child's stdio to the slave.

из-за этой ошибки:

$ reptyr 30622

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

И с -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw