Если ваша задача уже запущена, она слишком поздно , *
чтобы рассмотреть альтернативные решения, вставка дополнительный слой между ssh
сессией и оболочки , выполнив команду, как screen
, tmux
, byobu
, nohup
и любит.
Если ваша поддержка процесс будет выполняться в фоновом режиме и , в частности , не зависает , когда stdout
и stderr
в записи нового / закрыто, вы можете поместить его в фоновом режиме перед выходом из системы с ControlZи bg
затем отсоединить его от оболочки с disown
встроенной командой.
например:
$ ssh localhost
You have new mail.
Last login: Fri Jun 6 11:26:56 2014
$ /bin/sleep 3600
^Z[1] + Stopped /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] + Running /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864 1 0 21:12 ? 00:00:00 /bin/sleep 3600
jlliagre 13056 12477 0 21:13 pts/18 00:00:00 grep sleep
$
*
Как прокомментировал Боб, на самом деле есть несколько хакерских способов переписать tty-сессию под Linux. repty, retty , injcode и neercs . Наиболее продвинутый выглядит как reptyr, но вам могут потребоваться привилегии root, чтобы ptrace могла взломать ваш процесс.
disown
команду. Он вернул: bash: warning: удаление остановленного задания 1 с группой процессов 24876. Теперь моя работа указана в списке,ps -all
но, кажется, не работает ( загрузка ЦП составляет 0%)disown
командойbg
команда требовалась в первой части моего ответа. Ред.kill -CONT
примерно так же, как bg.Одним из решений является использование экрана GNU . Вы можете запустить
screen
, выполнить команду, а затем отключитьсяC-a d
. Позже, чтобы восстановить соединение, сделайтеscreen -r
, и вы вернетесь к предыдущей сессии.Другими преимуществами экрана является управление окном (так что вы можете переключаться на другие оболочки, когда ваша команда выполняется, без необходимости нового соединения SSH), и это позволяет вашей команде оставаться на переднем плане, будь то текущий сеанс или более поздний.
Редактировать: как отмечено в комментариях, это будет работать только в том случае, если вы не забыли запустить
screen
перед запуском команды. Если команда уже запущена, вам понадобится решение @ jlliagre.источник
tmux
другая программа, подобнаяscreen
этой, которая позволяет вам иметь удаленный сеанс, который не привязан к вашему текущему SSH-соединению.screen
.screen
илиtmux
.)Один из «стандартных» способов сделать это - использовать
nohup
команду, включенную вcoreutils
:Но команда перенаправит вывод (
STDOUT
&STDERR
AFAIK) программы в файлnohup.out
, что иногда делает его несколько раздражающим (например, создание огромного файла журнала), поэтому вы можете захотеть сделать свое собственное перенаправление или перенаправить его в / dev / null если хочешь.источник
nohup
может быть использовано для этого. Просто приостановите запущенный процесс и отправьте его в фоновый режим (Ctrl
+Z
и запуститеbg
), и тогда вы сможете выполнить командуnohup %1
.В дополнение к этому
nohup
вы можете запустить процесс в фоновом режиме, используя «&» и subshell:Добавьте к команде команду & и заключите в скобки
Допустим, ваш процесс получает pid 1922:
Посмотрите, что он отсоединен от процесса оболочки 11473, который был его первоначальным родителем. Итак, если вы выйдете или убьете текущую оболочку (11473), процесс 11922 продолжит работу, и он будет отключен от точки.
Попробуйте выйти из оболочки и войти в новую оболочку. Даже если эта оболочка подключена к одному и тому же pts, вы можете увидеть процесс без pts:
Я не знаю, как это называется или задокументировано в Posix, но я использую этот способ с 1990 года в bsh, ksh и теперь в bash.
Наконец, вы можете использовать команду
bg
встроенной оболочки:Просто запустите свою программу и, если вы решите приостановить ее или планируете оставить ее в фоновом режиме, нажмите CTRL + Z:
Теперь позвольте ему продолжать работать в фоновом режиме:
Если вы посмотрите на информацию о процессе, у него есть родительский процесс:
Итак, выход из текущего процесса. Запущенный процесс в фоновом режиме отсоединяется от своего исходного родителя и продолжает работать в фоновом режиме:
Войдите снова и посмотрите информацию о процессе:
источник