Каков практический пример использования команды suspend в Bash?

12

suspendвстроенная команда в Bash Когда бы вы естественным образом использовали эту команду и сочли ее полезной?

игорь
источник
1
Оболочка приостанавливает себя каждый раз, когда она разветвляется на дочерний процесс, т. fork/exec
Е. Запускает
1
В интерактивной оболочке это позволяет дочернему процессу получить контроль над терминалом, в то время как родительская оболочка не взаимодействует с терминалом, что приводит к беспорядку.
the_velour_fog
2
@velour, но для этого не требуется запускать отдельную команду на этот счет?
ilkkachu
@the_velour_fog Технически родительская оболочка не приостанавливается (она не получает STOPсигнал), когда она разветвляется на дочерний процесс. Я также немного смущен вашим вторым комментарием.
Кусалананда
1
@ Kusalananda хорошо, правильно wait()звучит разумно для меня. Я сказал, что оболочка приостанавливает себя каждый раз, когда она разветвляется на дочерний процесс . Я ничего не говорил о получении сигналов остановки, это не имело бы никакого смысла.
the_velour_fog

Ответы:

14

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

Сначала вы должны войти в консоль, а затем запустить новую оболочку, временно заблокировав оболочку входа. Чтобы вернуть оболочку входа в систему и выполнить там какую-то работу, вам нужно это сделать suspend. Затем вы должны fgвернуть интерактивную оболочку, чтобы продолжить то, что вы там делали.

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

Также обратите внимание, что Ctrl+ Zв приглашении в интерактивной оболочке не приостановит его.

РЕДАКТИРОВАТЬ: у меня изначально был длинный гипотетический раздел об использовании suspendв сценарии, но так как команда требует управления заданиями и поскольку неинтерактивные оболочки обычно не имеют управления заданиями, я удалил этот раздел.


Удаленный раздел с suspendзаменой на kill -s STOP $$(это действительно больше не относится к ответу, но в любом случае это может быть интересно другим):

Предположим, у вас есть фоновый процесс (скрипт) в скрипте, и что этот фоновый процесс на каком-то этапе должен остановиться и дождаться, пока родительский процесс скажет, что он продолжится. Это может быть так, чтобы у родителя было время извлечь и переместить файлы на место или что-то в этом роде.

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

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

Кусалананда
источник