10 ответов:
С помощью Контрольная Работа из bash, чтобы отправить процесс в фоновом режиме:
- Ctrl+Z чтобы остановить (приостановить) программу и вернуться в оболочку.
bg, чтобы запустить его в фоновом режиме.disown -h [job-spec]где [job-spec] - номер задания (например%1для первого запущенного задания; найдите свой номер с помощьюjobsкоманда), чтобы задание не было убито, когда терминал закрывается.
предположим, что по какой-то причине Ctrl+Z также не работает, перейдите на другой терминал, найдите идентификатор процесса (используя
ps) и запустите:kill -20 PID kill -18 PID
kill -20(SIGTSTP) приостановит процесс иkill -18(SIGCONT) возобновит процесс, в фоновом режиме. Так что теперь закрытие обоих ваших терминалов не остановит ваш процесс.
команда для отделения запущенного задания от оболочки (= делает его nohup) является
disownи базовая команда оболочки.от bash-manpage (man bash):
откреститься [- ar] [- h] [jobspec ...]
без опций каждый jobspec удаляется из таблицы активных заданий. Если задан параметр-h, то каждый jobspec не является удаляется из таблицы, но помечается так, что SIGHUP не отправляется в задание, если оболочка получает SIGHUP. Если jobspec не будет присутствует, и ни-a, ни-r опция не предоставляется, используется текущее задание. Если jobspec не поставляется, опция-a средство для удаления или пометки всех заданий; параметр-r без аргумента jobspec ограничивает операцию выполняемыми заданиями. Возвращение значение равно 0, если jobspec не указывает допустимое задание.
это значит, что простой
disown -aудалит все задания из таблицы заданий и сделает их nohup
Это хорошие ответы выше, я просто хотел добавить уточнение:
нельзя
disownпид или процесс, выdisownработа, и это важное различие.задание - это то, что является понятием процесса, который прикреплен к оболочке, поэтому вы должны бросить задание в фоновом режиме (а не приостановить его), а затем откреститься от него.
вопрос:
% jobs [1] running java [2] suspended vi % disown %1посмотреть http://www.quantprinciple.com/invest/index.php/docs/tipsandtricks/unix/jobcontrol/ для более подробного обсуждения управления заданиями Unix.
к сожалению
disownспецифичен для bash и доступен не во всех оболочках.некоторые ароматы Unix (например, AIX и Solaris) имеют опцию на
nohupсама команда, которая может быть применена к запущенному процессу:nohup -p pid
ответ узла действительно велик, но он оставил открытым вопрос, как можно перенаправить stdout и stderr. Я нашел решение на Unix & Linux, но он также не является полным. Я хотел бы объединить эти два решения. Вот это:
для моего теста я сделал небольшой скрипт bash под названием loop.sh, который печатает pid самого себя с минутным сном в бесконечном цикле.
$./loop.shтеперь получить PID этого процесса каким-то образом. Обычно
ps -C loop.sh- это хорошо достаточно, но он напечатан в моем случае.теперь мы можем переключиться на другой терминал (или нажать ^Z и в тот же терминал). Сейчас
gdbдолжны быть присоединены к этому процессу.$ gdb -p <PID>это останавливает скрипт (если он запущен). Его состояние можно проверить с помощью
ps -f <PID>, гдеSTATполе ' T+ '(или в случае ^Z 'T'), что означает (man ps(1))T Stopped, either by a job control signal or because it is being traced + is in the foreground process group (gdb) call close(1) = 0Close(1) возвращает ноль при успешном выполнении.
(gdb) call open("loop.out", 01102, 0600) = 1Open (1) возвращает новый файл дескриптор в случае успеха.
это открытие равно с
open(path, O_TRUNC|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR). ВместоO_RDWRO_WRONLYможно применить, но/usr/sbin/lsofговорит ' u ' для всех обработчиков std * файлов (FDстолбец), которая составляетO_RDWR.я проверил значения в /usr/include/bits / fcntl.H заголовочный файл.
выходной файл можно открыть с помощью
O_APPEND, аnohupсделал бы, но это не предлагалиman open(2), из-за возможных проблем с NFS.если мы получим -1 в качестве возвращаемого значения, то
call perror("")выводит сообщение об ошибке. Если нам нужен errno, используйтеp errnogdb comand.теперь мы можем проверить вновь перенаправлены файл.
/usr/sbin/lsof -p <PID>принты:loop.sh <PID> truey 1u REG 0,26 0 15008411 /home/truey/loop.outесли мы хотим, мы можем перенаправить stderr в другой файл, если мы хотим использовать
call close(2)иcall open(...)еще раз, используя другое имя файла.теперь прилагается
bashдолжен быть освобожден, и мы можем броситьgdb:(gdb) detach Detaching from program: /bin/bash, process <PID> (gdb) qесли скрипт был остановлен
gdbиз другого терминала он продолжает работать. Мы можем переключиться обратно loop.sh-это терминал. Теперь он ничего не записывает на экран, но работает и записывает в файл. Мы должны отодвинуть это на задний план. Так что нажмите^Z.^Z [1]+ Stopped ./loop.sh(сейчас мы находимся в том же состоянии, как если
^Zбыл нажат в начале.)теперь мы можем проверить состояние задания:
$ ps -f 24522 UID PID PPID C STIME TTY STAT TIME CMD <UID> <PID><PPID> 0 11:16 pts/36 S 0:00 /bin/bash ./loop.sh $ jobs [1]+ Stopped ./loop.shпоэтому процесс должен быть запущен в фоновом режиме и отделен от терминал. Число в
jobsвывод команды в квадратных скобках определяет задание внутриbash. Мы можем использовать в следующем встроенныйbashкоманды, применяющие знак " % " перед номером задания:$ bg %1 [1]+ ./loop.sh & $ disown -h %1 $ ps -f <PID> UID PID PPID C STIME TTY STAT TIME CMD <UID> <PID><PPID> 0 11:16 pts/36 S 0:00 /bin/bash ./loop.shи теперь мы можем выйти из вызывающей Баш. Процесс продолжает работать в фоновом режиме. Если мы выйдем из его PPID стать 1(init (1) процесс) и терминал управления стать неизвестный.
$ ps -f <PID> UID PID PPID C STIME TTY STAT TIME CMD <UID> <PID> 1 0 11:16 ? S 0:00 /bin/bash ./loop.sh $ /usr/bin/lsof -p <PID> ... loop.sh <PID> truey 0u CHR 136,36 38 /dev/pts/36 (deleted) loop.sh <PID> truey 1u REG 0,26 1127 15008411 /home/truey/loop.out loop.sh <PID> truey 2u CHR 136,36 38 /dev/pts/36 (deleted)комментарий
материал gdb может быть автоматизирован, создавая файл (например, цикл.gdb) содержащий команды и run
gdb -q -x loop.gdb -p <PID>. Моя петля.gdb выглядит так:call close(1) call open("loop.out", 01102, 0600) # call close(2) # call open("loop.err", 01102, 0600) detach quitили можно использовать следующий один лайнер вместо:
gdb -q -ex 'call close(1)' -ex 'call open("loop.out", 01102, 0600)' -ex detach -ex quit -p <PID>я надеюсь, что это довольно полное описание решения.
для отправки запущенного процесса в nohup (http://en.wikipedia.org/wiki/Nohup)
nohup -p pid, Это не сработало для менязатем я попробовал следующие команды, и это сработало очень хорошо
выполнить некоторые SOMECOMMAND, скажи
/usr/bin/python /vol/scripts/python_scripts/retention_all_properties.py 1.Ctrl+Z чтобы остановить (приостановить) программу и вернуться в оболочку.
bg, чтобы запустить его в фон.
disown -hчтобы процесс не был убит, когда терминал закрывается.тип
exitвыйти из оболочки, потому что теперь вы хорошо идти, как операция будет выполняться в фоновом режиме в своем собственном процессе, поэтому он не привязан к оболочке.этот процесс эквивалентен запуску
nohup SOMECOMMAND.
на моей системе AIX, я пытался
nohup -p processid>он работал хорошо. Он продолжал запускать мой процесс даже после закрытия окон терминала. У нас есть KSH в качестве оболочки по умолчанию, поэтому
bgиdisownкоманды не работают.
- ctrl + z - это приостановит работу (не собирается отменять!)
bg- это поставит задание в фоновом режиме и вернуться в запущенном процессеdisown -a- это вырезать все вложения с работы (так что вы можете закрыть терминал и он все равно будет работать)эти простые шаги позволят вам закрыть терминал, сохраняя процесс работает.
он не надел
nohup(исходя из моих понимание вашего вопроса, вам это не нужно здесь).
это работало для меня на Ubuntu linux в то время как в tcshell.
CtrlZ приостановить
bgна
jobsчтобы получить свой номер задания
nohup %nгде N-номер задания
Comments