Це має стосуватися будь-якої оболонки з контролем роботи, яку (здебільшого) ви можете прийняти як належне, якщо не мати справу з справді древньою оболонкою. Це в стандарті 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
це число.