Скажите, что вы начинаете такую работу
foo
и затем желайте, чтобы вы захотели поместить его в фоновом режиме. Набрав Ctrl + Z, а затем b g выполнит трюк, но заморозит foo
между Ctrl + Z и b g . Как я могу разместить foo в фоновом режиме, не заперв его сначала?
Отправка приложения с переднего плана на задний план требует сотрудничества как с терминалом, так и с оболочкой. Терминал не может сделать это в одиночку, потому что оболочка должна установить группу процессов переднего плана. Оболочка не может сделать это сама по себе, потому что терминал должен обработать нажатие клавиши (оболочка не находится на переднем плане, поэтому она не может получить нажатие клавиши).
У меня есть zsh-конфигурация, где я могу быстро нажать Ctrl + Z дважды подряд; первое нажатие приостанавливает процесс, а второе нажатие возобновляет его в фоновом режиме. Я не знаю, как перенести его в bash.
Если вы используете эмулятор терминала, который позволяет вводить нажатия клавиш, вы можете ввести ^Zbg^M
(используя ^
обозначение для управляющих символов). Например, с эмулятором терминала X11, запустите xdotool --window 1234 Ctrl_L+Z bg Return
где 1234 – это идентификатор окна эмулятора терминала. С помощью экрана запустите screen -S foo -p 12 -X stuff $'\032bg\r'
где foo
– это имя сеанса экрана, а 12
– идентификатор окна.
Технически foo
уже работает в фоновом режиме. Вы можете начать второй сеанс терминала, и первый будет продолжать работать с foo
пока вы делаете другие вещи.
В X это просто включает в себя запуск второго приложения терминала или открытие другой вкладки, если у вашего эмулятора терминала есть такие функции.
На консоли, если вы не планируете это, вам нужно будет переключиться на другой виртуальный терминал и снова войти в систему.
Если вы используете терминальный мультиплексор, например, screen
или tmux
вы можете запустить в нем еще один сеанс. Например, на экране это делается с помощью Ctrl + A, а затем Ctrl + C. Чтобы переключаться между ними, используйте Ca Cn и Ca Cp для перехода между сеансами терминала.
Добавление знака &
после команды ( foo &
) немедленно закроет его. Но я считаю, что в стандартной конфигурации терминалов / оболочек нет никакого способа сделать что-то сразу, как только оно будет перенесено на передний план.
Если ваш ввод не достаточно быстрый для случая, то запустите kill -s SIGSTOP 1023 && kill -s SIGCONT 1023
из другой оболочки, предположив, что 1023 является целевым PID.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Как, наверное, знал Руслан , эта последовательность фактически перезапускает работу так быстро, что она не замечает этого.