Это должно относиться к любой оболочке с контролем заданий, которую (по большей части) вы можете принять как должное, если не имеете дело с действительно древней оболочкой. Он соответствует стандарту POSIX , поэтому даже dash
поддерживает управление заданиями (при запуске в интерактивном режиме или с помощью -m
).
интерактивный
- Ctrl+ zприостановит текущую программу
bg
создаст фон для самой последней приостановленной программы
(используйте bg %2
номер задания, который вы можете проверить jobs
)
fg
выдвинет на первый план самую последнюю приостановленную программу
В zsh
, вы можете написать привязку ключа для неявного запуска fg
из приглашения через другой Ctrl+ z:
_zsh_cli_fg() { fg; }
zle -N _zsh_cli_fg
bindkey '^Z' _zsh_cli_fg
Вероятно, есть и умный способ неявного запуска bg
при приостановке, но он кажется неразумным; по крайней мере для меня, большинство моих Ctrl+ zиспользований, потому что Ctrl+ cне в состоянии вспыхнуть; Я хочу следовать этому, например, kill %1
вместо bg
, и я, конечно же, не хочу по умолчанию убивать! (Эта логика также распространяется на то, почему я больше не использую эту привязку клавиш: если я нажимаю Ctrl+, zчтобы остановить процесс, последнее, что я хочу, это возобновить!)
Неинтерактивный
Если вы находитесь в другом экземпляре оболочки (или у другого пользователя, иногда с sudo
командами), вы, скорее всего, не сможете использовать рабочие номера.
Вы по-прежнему можете работать с другим процессом, узнав его идентификатор процесса (PID). Вы можете получить PID с помощью pgrep …
, или ps aux |grep …
(или из той же оболочки jobs -l
, или $!
), и затем вы можете запустить:
kill -STOP $PID # suspend
kill -CONT $PID # continue (resume)
Если вы не знаете идентификатор процесса и не беспокоитесь о приостановке других экземпляров процесса по имени, вы можете передать сигналы одному из них:
killall -STOP program_name
pkill -STOP program_name
pkill -f -STOP program_name_or_args
CONT
Сигнал к программе останавливали Ctrl+ z(а не bg
«г) возобновит прогресс (на переднем плане), то же самое , как если бы вы были fg
его.
Re: Стандартная ошибка
Правка к этому вопросу спрашивает о стандартной ошибке:
Процесс выводит на stderr, так как мне выполнить команду, fg <jobid>
пока процесс выводит на терминал?
Если в рассматриваемой работе нет компонентов, которые являются фоновыми (или вся работа является фоновой, возможно, через kill -CONT
), вы фактически не должны видеть выходные данные, пока они приостановлены.
Если он все еще выводит данные (будь то стандартный вывод или стандартная ошибка), это, безусловно, сделает ваш терминал визуально загроможденным, но весь этот вывод будет проигнорирован, поскольку он не является частью вашего ввода. Это может затруднить понимание того, что вы не ввели никаких опечаток, но (вслепую) набора текста fg
Enterдолжно быть достаточно (если у вас нет нескольких заданий, а рассматриваемое не самое последнее, и в этом случае вам действительно понадобится дескриптор задания). ).
Если вам нужно найти дескриптор задания, используйте другой терминал для отправки ему STOP
сигнала с помощью неинтерактивных методов, описанных выше. Это должно освободить ваш дисплей (возможно, ударить Enterнесколько раз или запустить clear
или Ctrl+ L), чтобы вы могли затем запустить, jobs
чтобы найти дескриптор задания, а затем запустить, fg %N
где N
это число.