Поместите работу в фоновом режиме без заморозки

9

Скажем, вы начинаете работу, как это

foo

а затем желание, чтобы вы хотели поместить его в фоновом режиме. Нажатие Ctrl+, Zа затем bgделает трюк, но будет зависать fooмежду Ctrl+ Zи bg. Как разместить foo на заднем плане, не заморозив его?

user877329
источник
7
Какой вариант использования? Почему проблема в том, что процесс на короткое время зависает?
10

Ответы:

4

Технически fooуже работает в фоновом режиме. Вы можете начать второй сеанс терминала, и первый продолжит работать, fooпока вы будете заниматься другими делами.

В X это просто включает запуск второго терминального приложения или открытие другой вкладки, если ваш эмулятор терминала имеет такие функции.

На консоли, если вы не планируете этого, вам нужно будет переключиться на другой виртуальный терминал и войти снова.

Если вы используете терминальный мультиплексор, например, screenили tmuxвы можете начать другой сеанс внутри него. Например, на экране это делается с помощью Ctrl+, Aсразу после Ctrl+ C. Для переключения между ними используйте Ca Cn и Ca Cp, чтобы переключаться между терминальными сессиями.

CVn
источник
То есть в bash это невозможно.
user877329
1
Этот ответ, кажется, основан на неправильном понимании концепции фоновой работы. Терминал имеет атрибут «группа процессов переднего плана», обычно устанавливаемый оболочкой, что делает процессы в этой группе способными считывать данные с терминала и принимать связанные с tty сигналы, такие как SIGINT. Все процессы, запущенные на терминале, которые не входят в группу процессов переднего плана, являются фоновыми процессами. Когда вы создаете новый терминал, задание переднего плана исходного терминала остается заданием переднего плана на этом терминале, даже если вы на него не смотрите.
@ WumpusQ.Wumbley Суть моего ответа заключается в том, что большинство (все?) Систем, которые могут запускать bash, по своей природе являются многозадачными. В такой системе, даже если процесс имеет, скажем, фокус ввода, нет ничего по сути "переднего плана" в самом процессе ; foo сама по себе (отсутствие специальной проверки, которая, как я предполагаю, в дикой природе находится где-то между редкостью и несуществующей), не имеет значения, выполняется ли она в самом верхнем окне или даже если что-то отображает ее вывод.
CVn
1
моя точка зрения такова, что когда в вопросе конкретно упоминаются слова «фон» и «работа» - оба из которых являются техническими терминами со значениями, определенными структурой группы процессов POSIX, - а также механизмы Ctrl-Z и bg, оба из которых работать с группами процессов - и ваш ответ предлагает вообще не использовать функциональность группы процессов, и вы используете слово «фон» таким образом, который не соответствует его фактическому определению - вы не подходите к своему ответу на вопрос. И начать с "Технически fooуже работает в фоновом режиме" ... просто ... Нет. Технически.
@ WumpusQ.Wumbley Почему-то я не думаю, что OP читал стандарт POSIX и думал: «Хм, я бы хотел использовать это, но я уже начал, fooтак что теперь мне делать?». Если вы чувствуете, что этот ответ (или другие ответы) бесполезен при ответе на вопрос, я призываю вас воспользоваться своими привилегиями для голосования, а также оставить свой собственный ответ, отвечая на вопрос с точки зрения того, что вы считаете правильным, а не рассуждая об одном из оставленных ответов на вопрос. Возможно, вы чувствуете, например, что ответ l0b0 лучше, но мой ответ предлагает способ сделать хотя бы примерно то, что хочет ОП.
CVn
3

Добавление &знака после команды ( foo &) немедленно создаст фон. Но я полагаю, что в стандартной конфигурации терминала / оболочки нет никакого способа немедленно отстоять что- либо, как только оно будет установлено заранее.

l0b0
источник
3

Отправка приложения из переднего плана в фоновый режим требует взаимодействия как терминала, так и оболочки. Терминал не может сделать это один, потому что оболочка должна установить группу процессов переднего плана. Оболочка не может сделать это одна, потому что терминал должен обрабатывать нажатие клавиши (оболочка не на переднем плане, поэтому он не может получить нажатие клавиши).

У меня есть конфигурация zsh, где я могу нажать Ctrl+ Zдважды подряд; первое нажатие приостанавливает процесс, а второе нажатие возобновляет его в фоновом режиме. Я не знаю, как перенести его на bash.

Если вы работаете в эмуляторе терминала, который позволяет вводить нажатия клавиш, вы можете сделать это ^Zbg^M(используя ^нотацию для управляющих символов). Например, с эмулятором терминала X11 запустите, xdotool --window 1234 Ctrl_L+Z b g Returnгде 1234 - идентификатор окна эмулятора терминала. В Screen запустите screen -S foo -p 12 -X stuff $'\032bg\r'где fooимя сеанса экрана и 12идентификатор окна.

Жиль "ТАК - перестань быть злым"
источник
2

Если вы набираете текст недостаточно быстро, запустите программу kill -s SIGSTOP 1023 && kill -s SIGCONT 1023из другой оболочки, предположив 1023 в качестве целевого PID.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Как Руслан, вероятно, знал, эта последовательность фактически возобновляет работу так быстро, bashчто не замечает этого.

41754
источник
Как бы это поставить работу на задний план?
Руслан
Как быстро это быстро?
user877329