Как поместить уже запущенный процесс под nohup?
У меня есть процесс, который уже продолжительное время работает, и я не хочу его завершать.
Как мне перевести его под управление nohup (то есть, как заставить его продолжать выполнение даже после закрытия терминала)?
5 ответ(ов)
Если по какой-то причине символ +
также не работает, откройте другой терминал, найдите идентификатор процесса (используя команду ps
) и выполните следующие команды:
kill -SIGSTOP PID
kill -SIGCONT PID
SIGSTOP
приостановит выполнение процесса, а SIGCONT
возобновит его выполнение в фоновом режиме. Таким образом, закрытие обоих терминалов не остановит ваш процесс.
Команда для отделения запущенной задачи от оболочки (то есть чтобы она продолжала работать в фоновом режиме, даже если оболочка закроется) — это disown
в сочетании с базовой командой оболочки.
Согласно справочному руководству по bash (man bash):
disown [-ar] [-h] [jobspec ...]
Без опций каждая jobspec
удаляется из таблицы активных задач. Если указана опция -h
, каждая jobspec
не удаляется, но помечается так, чтобы сигнал SIGHUP не отправлялся задаче, если оболочка получит SIGHUP. Если jobspec
не указана, и опции -a
или -r
не заданы, используется текущая задача. Если jobspec
не указана, опция -a
означает удалить или пометить все задачи; опция -r
без аргумента jobspec
ограничивает действие работающими задачами. Значение возвращаемого кода равно 0, если jobspec
указывает на допустимую задачу.
Это значит, что простая команда
disown -a
удалит все задачи из таблицы задач и сделает их независимыми от оболочки (nohup).
Это хорошие ответы выше, я просто хотел внести небольшое уточнение:
Вы не можете disown
(отсоединить) PID или процесс, вы disown
(отсоединяете) задачу, и это важное различие.
Задача — это понятие процесса, который привязан к оболочке, поэтому вам нужно отправить задачу в фон (не приостановить её) и только потом выполнить disown
.
Проблема:
% jobs
[1] running java
[2] suspended vi
% disown %1
Посмотрите http://www.quantprinciple.com/invest/index.php/docs/tipsandtricks/unix/jobcontrol/ для более подробного обсуждения управления задачами в Unix.
К сожалению, команда disown
является специфичной для shell bash и недоступна во всех оболочках.
Некоторые версии Unix (например, AIX и Solaris) имеют опцию непосредственно в команде nohup
, которую можно применить к запущенному процессу:
nohup -p pid
Дополнительную информацию можно найти по ссылке: http://en.wikipedia.org/wiki/Nohup
Вот простые и самые легкие шаги для управления процессами в терминале:
Ctrl + Z
----------> Приостанавливает процессbg
--------------> Возобновляет и запускает процесс в фоновом режимеdisown %1
-------------> Необходимо только в том случае, если нужно отсоединить процесс от терминала
Как выводить команды оболочки по мере их выполнения
Назначение значений по умолчанию для переменных оболочки одной командой в bash
Как указать приватный SSH-ключ для выполнения команды shell в Git?
Как сделать паузу в shell-скрипте на одну секунду перед продолжением?
Как использовать 'grep' для непрерывного потока?