2009-04-28 3 views
10

Вопрос особенный, потому что некоторые клавиши, такие как CTRL + Z, перестали работать.Как я могу поместить процесс в фоновый режим после его выполнения со сломанным CTRL + Z?

Я пытался поставить процесс на фоне, набрав в следующем порядке:

  1. найти/
  2. CTRL + Z
  3. Б.Г.

Однако я все еще может видеть stdout. Единственное отличие только от первого шага состоит в том, что команда CTRL + Z больше не работает. Это довольно неприятно, когда у меня есть несохраненные задания, а мой жесткий диск - более 100 ГБ. Таким образом,

Как я могу поместить процесс в фоновом режиме?

[Подробности]

Я использую четвертую версию Bash на Mac.

[Crux Ответить Николас Райли]

Проблема заключается в том, что я действительно не понимаю «последствия» запущенных процессов фона. Я не могу понять, почему commnands, такие как CTRL + Z, не работают с фоновыми процессами. Я все еще был в состоянии убить процесс в другой оболочке с помощью команды:

ps -ej | awk '! /grep/ && /find/ {print $2}' | xargs kill -9 

ответ

12

^Z не работает, потому что самое раннее задание теперь является оболочкой, а оболочки обычно не реагируют на SIGTSTP. (Если вы действительно хотите приостановить оболочку без входа, обычно работает suspend).

Проблема заключается в том, что вы неправильно понимаете последствия работы, находящейся в фоновом режиме. Перенаправление стандартного вывода задания не имеет отношения.

На самом деле, неясно что вы хотите. Если вы просто хотите остановить find, то fg и используйте ^C или ^\ (которые по умолчанию отправляют SIGINT и SIGQUIT соответственно).

Если вы хотите сохранить find, но подавите его дальнейший выход, тогда самое легкое решение, о котором я могу думать, это использовать bg ; disown ; exit. Это заставит оболочку убить свой дочерний процесс (find) и выйти из оболочки; предполагая, что он находится на верхнем уровне окна терминала, вы увидите немного больше выходных данных, и find будет продолжать работать (но вы не сможете взаимодействовать с ним).

+0

Можете ли вы уточнить предложение «Перенаправление стандартного вывода задания не имеет отношения».? –

+2

Несомненно. Основной эффект фонового процесса заключается в том, что ваш * вход * (включая сигналы, например^Z) больше не взаимодействует с этим процессом; вместо этого они взаимодействуют с родительской оболочкой. Если процесс не написан, чтобы проверить, находится ли он в фоновом режиме и что-то другое, результат все равно будет исходить из этого процесса. –

+0

Riley: Спасибо! –

5

Вы можете установить операцию на другой ключ с Запущенная на любой UNIX-подобной системе.

$ stty susp Q 

сделает Q вашим ключом подвески вместо CTRL-Z.

+0

Это бриллиант! Теперь вы не можете использовать Q-ключ для того, что предназначено для $ DEITY («Q»). – paxdiablo

+0

+1 для прохладной команды. –

+0

Вы не * имеете * использовать Q, Pax. –

0

Предполагаю, что вы используете общий вариант Linux или UNIX и, возможно, оболочку bash. В этом случае:

CTRL-Z посылает сигнал SIGTSTP в процесс переднего плана. Вы должны сделать то же самое с командой kill, указав kill -s SIGTSTP [pid].

2

Обычно я делаю это с помощью nohup. Как это:

поЬир найти /> /tmp/myresults.txt &

поЬир убеждается, что этот процесс не останавливается, даже если консоль уходит (как, вы закрыть окно или потерять SSH или что-то еще). «>» Отправляет вывод в файл, а не в консоль, а «&» помещает задание в фоновом режиме.

+0

Идея, которая только что появилась у меня из nohup: «использовать ее с помощью экранной команды», например «nohup screen». Это может быть полезно. +1 для обмена опытом –

+0

Зачем вам использовать экран с nohup? экран имеет встроенную функцию отсоединения. (C-a, C-d) –

5

Фоновая обработка процесса не приведет к отключению вывода от терминального устройства, поэтому вы все еще видите вывод, и на выходе могут содержаться управляющие символы, которые могут набивать ваши настройки TTY (cat двоичные файлы - хороший способ сделай это).

Если вы хотите, чтобы работа работать в фоновом режиме, сделать это правильно:

find/>/tmp/out 2>&1 & 

затем проверить файл /tmp/out, когда она будет закончена.

+0

За исключением того, что вы обычно не ставили 2> & 1 перед>/tmp/out? (Разумеется, у меня на самом деле нет подсказки, поэтому не стесняйтесь игнорировать.) –

+5

Нет, @ Джереми, потому что он позиционный. Моя версия направляет stdout в файл, а затем stderr на то же место, что и stdout (файл). Ваше предложение направило бы stderr на то же место, что и stdout (терминал), а затем stdout в файл. И я редко игнорирую вопросы, я бы лучше учился. – paxdiablo

+0

+1 за ваш комментарий :) –

0

Я знаю, что в Ubuntu 9.04 вы можете начать процесс с & после его запуска в фоновом режиме. Например, «sudo gedit /boot/grub/menu.lst &» запустит текстовый редактор, редактирующий конфигурационный файл GRUB в фоновом режиме.

6

Я использую нет.

find/& disown 
exit # close the terminal and the command still runs 

Вы можете использовать откреститься после вас^Z, а также:

find/
^Z 
bg 
disown 
exit 

открестился является Баш встроенная, я считаю. Не уверены в альтернативах для других снарядов.

Дополнительную информацию см. my equivalent answer on Server Fault.

+1

+1 для вашего систематического объяснения –