Який практичний приклад використання команди призупинення в Bash?


12

suspend- це вбудована команда в Bash. Коли ви природно використовуєте цю команду і вважаєте її корисною?


1
Оболонка призупиняє себе щоразу, коли вона розсилає дочірній процес, тобто виконує команду, де зазначена команда є зовнішньою програмою, вимагає fork/execсистемного виклику
the_velour_fog

1
В інтерактивній оболонці це дозволяє дочірньому процесу отримати контроль над терміналом, при цьому батьківська оболонка не взаємодіє з терміналом, який стає безладним.
the_velour_fog

2
@velour, але для цього не потрібно запустити окрему команду?
ilkkachu

@the_velour_fog Технічно батьківська оболонка не призупиняється (вона не отримує STOPсигнал), коли вона розщеплює дочірній процес. Мене також трохи бентежить ваш другий коментар.
Kusalananda

1
@Kusalananda нормально, правильно wait()мені здається розумним. Я сказав, що шкаралупа призупиняє себе кожного разу, коли вона підсилює дитячий процес . Я нічого не говорив про отримання будь-яких стоп-сигналів, це не мало б сенсу.
the_velour_fog

Відповіді:


14

Скажімо, вам не вистачає і GNU, screenі tmux(і X11, і віртуальних консолей), але ви хочете перемикатися між оболонкою для входу та іншою інтерактивною оболонкою.

Ви спершу увійдете на консоль, а потім запустите нову оболонку, тимчасово блокуючи оболонку входу. Щоб повернути оболонку входу, щоб виконати якусь роботу там, ви зробите suspend. Тоді ви б fgповернули інтерактивну оболонку, щоб продовжувати все, що ви там робили.

Справді, з управлінням завданнями, то Ввійти оболонка може породити ряд інтерактивних оболонок в якості фону робочих місць , які ви могли б перейти на з fg %1, і fg %2так далі, але , щоб повернутися в оболонку входу, вам потрібно буде використовувати , suspendякщо ви не хотіли вручну kill -s STOP $$.

Також зауважте, що Ctrl+ Zу запиті в інтерактивній оболонці не призупинить її.

EDIT: Спочатку у мене був довгий гіпотетичний розділ щодо використання suspendв скрипті, але оскільки команда вимагає контролю за роботою, а оскільки неінтерактивні оболонки зазвичай не мають управління роботою, я видалив цей розділ.


Видалений розділ із suspendзаміненим на kill -s STOP $$(це дійсно вже не належить до відповіді, але це може бути цікаво іншим):

Скажімо, у вас є фоновий процес (скрипт) у сценарії, і що цей фоновий процес на певному етапі потрібно зупинити і чекати, коли батьківський процес скаже, щоб він продовжувався. Це може бути так, що батько встигає витягнути та перемістити файли на місце чи щось подібне.

Дочірній скрипт буде призупинено ( kill -s STOP $$), а батьківський сценарій надішле CONTсигнал йому, коли буде добре продовжувати.

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

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