Розміщуйте роботу у фоновому режимі без заморозки


9

Скажіть, ви починаєте роботу так

foo

а потім бажання, щоб ви хотіли помістити його на другий план. Введіть Ctrl+, Zа потім bgзробить трюк, але заморозиться fooміж Ctrl+ Zі bg. Як я можу розмістити фоновий фон у фоновому режимі, попередньо не заморозивши його?


7
Який випадок використання? Чому це проблема, що процес застигає на короткий час?
l0b0

Відповіді:


4

Технічно fooвже працює у фоновому режимі. Ви можете розпочати другий термінальний сеанс, і перший продовжить працювати, fooпоки ви робите інші дії.

У X це просто передбачає запуск другої програми терміналу або відкриття іншої вкладки, якщо ваш емулятор терміналу на вибір має такі функції.

На консолі, якщо ви цього не планували, вам потрібно буде перейти на інший віртуальний термінал і знову увійти.

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


Тобто, в баш не можна.
user877329

1
Здається, ця відповідь базується на нерозумінні концепції фонового завдання. Термінал має атрибут "групи процесу переднього плану", як правило, встановлений оболонкою, що робить процеси в цій групі здатними читати з терміналу і приймати сигнали, пов'язані з tty, як SIGINT. Усі процеси, що працюють на терміналі, які не належать до групи переднього плану, є фоновими процесами. Коли ви створюєте новий термінал, завдання переднього плану оригінального терміналу все ще є завданням переднього плану на цьому терміналі, навіть якщо ви не дивитесь на нього.

@ WumpusQ.Wumbley Суть моєї відповіді полягає в тому, що більшість (усіх?) Систем, які можуть запускати bash, за своєю суттю мають багатозадачні завдання. У такій системі, навіть якщо процес має, скажімо, фокус на вході, нічого не властиве «передньому плану» щодо самого процесу ; foo Сам по собі (відсутня специфічна перевірка, яка, як я думаю, в дикій природі знаходиться десь між рідкісним і неіснуючим), не важливо, працює він у самому верхньому вікні чи навіть якщо щось відображає його вихід.
CVn

1
моя думка полягає в тому, що, коли питання конкретно згадує слова "фон" та "робота", - це обоє технічні терміни зі значеннями, визначеними рамкою групи POSIX - а також механізми Ctrl-Z та bg, обидва з яких працюйте над групами процесів - і ваша відповідь пропонує взагалі не використовувати функціональність групи процесів, а ви використовуєте слово "фон" таким чином, що не відповідає його фактичному визначенню - ви не відповідаєте своїй відповіді на питання. А для початку з "Технічно fooвже працює у фоновому режимі" ... просто ... Ні. Технічно.

@ WumpusQ.Wumbley Якось не думаю, що ОП читав стандарт POSIX і думав: «Хм, я б хотів цим скористатися, але я вже почав fooтак, що тепер робити?». Якщо ви вважаєте, що ця відповідь (або інші відповіді) не корисна для відповіді на запитання, я б радив вам скористатись своїми правами на голосування , а також залишити відповідь на власний варіант відповіді на питання з того, що ви вважаєте, що це правильний кут, а не сперечаючись про одну з відповідей, залишених на запитання. Можливо, ви вважаєте, що відповідь l0b0 краще, але моя відповідь пропонує спосіб зробити хоча б приблизно те, що хоче ОП.
CVn

3

Додавання &знаку після команди ( foo &) негайно відтворить його. Але я вважаю, що в стандартній конфігурації термінала / оболонки немає можливості одразу передбачити щось, як тільки воно вийде на перший план.


3

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

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

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


2

Якщо введення тексту не є досить швидким для випадку, запустіть kill -s SIGSTOP 1023 && kill -s SIGCONT 1023з іншої оболонки, припустимо, 1023 як цільовий PID.

ВІДМОВА: Як Руслан, напевно, знав, що ця послідовність насправді перезавантажує роботу, так швидко її bashне помічають.


Як воно може поставити роботу на другий план?
Руслан

Як швидко швидко?
user877329
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.