Как вы отправляете приложения командной строки прямо в фон?

22

Я уже знаю, что нажатие ctrl+zостанавливает приложение, а затем я могу отправить приложение в фоновый режим с помощью bgкоманды, но это означает, что существует короткий период времени, в течение которого приложение останавливается.

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

trusktr
источник
Уверен, что вы не сможете, если он уже запущен.
Кевин
1
Если ваша задача требует ввода «перед исчезновением» в фоновом режиме, вы можете использовать такие инструменты, как zenity или yad (если вам нравится guis). Они по-прежнему могут отправлять и получать выходные данные из фона. Я уверен, что игра с трубами и устройствами также даст вам доступ к консоли из фона, но я не уверен, как это сделать.
Джо
@ Джо Это круто, но совсем не то, что я имею в виду. Я просто хочу отправить приложение напрямую в фоновый режим, не останавливая его. т.е. без нажатия с ctrl+zпоследующим запуском команды bg. Существует ли одна комбинация клавиш для отправки приложения в фоновый режим?
trusktr

Ответы:

17

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

Близкое приближение - отправить приложение на задний план очень быстро. В конце концов, приложение делит процессорное время с другими, и пауза в несколько сотых секунды не должна иметь значения. (Это относится к приложениям реального времени, поэтому убедитесь, что они запускаются в фоновом режиме.) Я использую привязку оболочки для Ctrl+, Zкоторая отправляет последнее заданное задание в фоновый режим. Таким образом, нажатие Ctrl+ Z Ctrl+ Zотправляет задание в фоновый режим с минимальным временем приостановки.

Вот моя привязка zsh, которая также «фоновая» полусведенная команда, когда командная строка не пуста .

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

На английском языке для не-zsh-пользователей в аудитории:

  • Определите функцию оболочки, которая выполняет следующие действия:

    • Если длина входного буфера равна 0, поместите текущее задание (последнее задание, которое было приостановлено или запущено в последний раз) в фоновом режиме и снова отобразите подсказку.
    • В противном случае поместите входной буфер в стек и покажите новое приглашение. Как только пользователь вводит команду или отменяет ее с помощью Ctrl+ C, отправленный буфер возвращается для дальнейшего редактирования.
  • Свяжите эту функцию с Ctrl+ Z.

Если вы просто хотите использовать фоновое поведение независимо от того, пуста ли командная строка:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

Я не знаю, можете ли вы сделать то же самое в bash. Это должно быть так же просто bind -x '"\C-z": bg', за исключением того, что bash оставляет символ tty stop на месте, поэтому он никогда не получает Ctrl+ Zкак ввод.

Жиль "ТАК - перестань быть злым"
источник
Интересно, посмотрим, можно ли это сделать в Bash. Если так, то это было бы решением. Я не знаком с Zsh. Не могли бы вы объяснить, что делает ваш сценарий?
trusktr
@trusktr Смотрите мои изменения.
Жиль "ТАК - перестань быть злым"
Благодарность! Я собираюсь перейти на Zsh. Я слышал так много хорошего об этом.
trusktr
15

Вы можете выполнить задание в фоновом режиме, добавив &после него.

Например, сразу же tail -f /var/log/messages &справится с задачей.

Как всегда, вы можете видеть, какие задачи вы выполняете с помощью jobsкоманды.

Это, конечно, предполагает, что вы еще не выполнили команду.

prateek61
источник
Это полезно, но не то, что я имею в виду. Если у меня есть приложение на переднем плане, а затем я хочу отправить его в фоновый режим , я могу нажать и ctrl+zзатем выполнить bgв командной строке, чтобы приложение работало в фоновом режиме. Но между нажатием ctrl+zи выполнением bgесть время, когда приложение полностью приостановлено. Я не хочу этого Как отправить его на фоне сразу ?
trusktr
@trusktr, как сказал Жиль. Вам необходимо сообщить как оболочку, так и терминал. Извините, я не знаю, как это сделать.
prateek61
Это не отвечает на вопрос.
Лучано Андресс Мартини
4

Фоновая команда выполняется путем добавления к ней амперсанда.

sleep 300 &

Если он уже запущен, ваш единственный вариант - остановить его, а затем фоновый режим.

bahamat
источник
Между нажатием ctrl + z и выполнением bg существует таймфрейм, когда приложение полностью приостановлено, чего я не хочу. Таким образом , нет никакого способа , чтобы отправить его в фоновый режим сразу ?
trusktr
1
Нет. Как сказал Джайлс, для этого нужны и оболочка, и терминал. Вы должны сообщить каждому.
Багамат