У меня запущена программа на SSH-оболочке. Я хочу приостановить его и иметь возможность приостановить его выполнение, когда вернусь.
Один из способов, которым я подумал сделать это, - это перенести свое владение на экранную оболочку, тем самым поддерживая его работу там.
Есть ли другой способ продолжить?
Ответы:
Использование GNU
screen
- ваш лучший выбор.Начать запуск экрана при первом входе в систему - я запускаю
screen -D -R
, запускаю вашу команду и отключаю или приостанавливаю ее,CTRL-Z
а затем отключаюсь от экрана, нажимаяCTRL-A
затемD
.При повторном входе в систему снова подключитесь, запустив
screen -D -R
. Вы будете в той же оболочке, что и раньше. Вы можете запустить,jobs
чтобы увидеть приостановленный процесс, если вы это сделали, и запустить%1
(или соответствующее задание #), чтобы снова поставить его на передний план.источник
Вы можете отозвать «владение» программой из оболочки с помощью
disown
встроенного:Однако это только говорит оболочке не отправлять
SIGHUP
сигнал программе при выходе из оболочки. Программа сохранит любое соединение с терминалом, как правило, в виде стандартных потоков ввода, вывода и ошибок. Нет возможности подключить их к другому терминалу. ( Экран работает, эмулируя терминал для каждого окна, поэтому программы прикрепляются к окну экрана.)Можно повторно присоединить файловые дескрипторы к другому файлу, подключив программу в отладчике (т.е. используя
ptrace
) и сделав ее вызовомopen
,dup
иclose
. Есть несколько инструментов, которые делают это; это сложный процесс, и иногда они могут привести к сбою процесса. Возможности включают (ссылки, собранные из ответов на Как я могу отречься от запущенного процесса и связать его с новой экранной оболочкой? И могу ли я nohup / screen уже запущенный процесс? ):источник
disown
удаляет процесс из списка управления заданиями.disown -h
?fg
илиkill
это, и посмотреть, закончится ли он сам по себе.bzcat a.bz2 | grep text
)? Человек дляreptyr
говорит, что не поддерживает перемещение процессов с детьми.Для перемещения процесса между терминалами или для повторного подключения отключенного, вы можете использовать, например, reptyr .
источник
screen
ответ, конечно, идеален, на самом деле он не отвечает на вопрос, в котором конкретно запрашивается способ перемещения текущего запущенного процессаscreen
или тому подобное. Также смотрите этот ответ: serverfault.com/a/284795Мое любимое решение использует
tmux
, вы можете отсоединить сеанс и повторно подключить его в другом терминале.Когда вы отсоединились от предыдущего сеанса, вы можете безопасно закрыть терминал; позже используйте,
tmux attach
чтобы вернуться к сеансу, даже если вы вышли из системы.источник
Есть также небольшая утилита, называемая retty, которая позволяет подключать запущенные программы к другому терминалу.
источник
Я не использую это регулярно, но претензии neercs, чтобы поддержать это. Это
screen
похожая программа с различными необычными функциями, такими как улучшенное управление панелями, но главное, что она предлагает, это возможность импортировать процесс в панель.источник
ptrace
), но он не просто манипулирует дескрипторами файлов, он разветвляет процесс. Он может захватитьfind /
, но разбился интерактивный удар.Если вы просто хотите приостановить его и перезапустить после, вы можете использовать
kill
сSTOP
илиCONT
сигнал.Сначала выясните процессы PID с
Затем отправьте сигналы этому PID, указанному в процессе
источник
"injcode" от ThomasHabets, кажется, именно то, что мне нужно:
https://github.com/ThomasHabets/injcode
Программа injcode позволяет вводить произвольный код в работающий процесс, вне зависимости от того, знали ли вы заранее и работали screen или tmux
Из README:
источник
Это сработало для меня:
bg
процессjobs -l
найти номер процессаtmux
запустить менеджер окон оболочкиreptyr -L PROCESSNUMBER
reptyr
«s-L
было необходимо , чтобы получить эту работу:-L Like '-l', but also redirect the child's stdio to the slave.
из-за этой ошибки:
И с -L
источник