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

Вопрос особенный, потому что некоторые клавиши, такие как CTRL + Z, перестали работать.

Я попытался перевести процесс в фоновый режим, введя порядок:

  • find/
  • CTRL + Z
  • bg

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

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

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

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

[Crux Reply by Nicholas Riley]

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

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

Ответ 1

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

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

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

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

Ответ 2

Я использую disown.

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

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

find /
^Z
bg
disown
exit

disown - это bash встроенный, я считаю. Не уверены в альтернативах для других оболочек.

Для получения дополнительной информации см. мой эквивалентный ответ на ошибку сервера.

Ответ 3

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

$ stty susp Q

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

Ответ 4

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

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

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

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

Ответ 5

Обычно я делаю это с nohup. Вот так:

nohup find/" > /tmp/myresults.txt &

nohup гарантирует, что процесс не прекратится, даже если консоль уйдет (например, вы закрываете окно или теряете свой SSH или что-то еще). " > " Отправляет вывод в файл, а не в консоль, и "&" помещает задание в фоновом режиме.

Ответ 6

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

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

Ответ 7

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