Рассмотрим ситуацию. Вы запустили редакторе nano чтобы создать новый файл, пусть его имя будет myfile:
nano myfile
После этого начали набирать некоторый текст:
И вдруг вам понадобилось выполнить какое-то действие в командной строке.
Да, можно сохранить файл, выйти, заново зайти, но хочется лишь ненадолго переключиться в командный интерпретатор.
Для этого вы нажимаете Ctrl-Z и редактор nano останавливается. Он остается в памяти, он не закрыт, редактируемый файл все также находится в памяти, но программа приостановлена. Она ждет, когда ей вернут управление.
Вы, пока nano находится в фоновом режиме, смотрите, а чем же являются команды fg, bg, jobs, о которых вы собирались написать? Внешними, или встроенными?
В этом помогает команда type. Например:
Выполним команду type для fg, bg и jobs
Мы видим, что все это встроенные команды, их выполняет сам bash.
Теперь мы можем вернуться в остановленный nano, выполнив команду fg:
Теперь редактор nano снова возобновил свою работу. И мы можем смело дописать наш текст:
После чего мы уже можем сохранить наш файл с помощью клавиши F2 (так в nano осуществляется сохранение и выход).
Когда-то давно фокус, схожий с остановкой программы и переходом в командную оболочку был в DOS и назывался «выход в DOS». Но работал он по другому. Вместо возврата в уже запущенную командную строку, запускалась новая, после выхода из которой управление передавалось на время приостановленной программы.
Теперь рассмотрим другую ситуацию.
Мы запустили команду, которая достаточно долго работает. Например, это создание образа CD-диска путем копирования из устройства CDROM в файл /opt/cd.iso.
Это делается командой sudo dd if=/dev/sr0 of=/opt/cd.iso
Команда выполняется достаточно долго, и не дает нам доступа к командной строке, пока не завершит свою работу.
В этом случае мы можем приостановить команду dd, нажав Ctrl-Z (^Z) и далее введя команду bg, которая возобновит работу в фоновом режиме.
Пока образ диска будет создаваться мы можем что-то поделать в командной строке.
Что у нас получилось, разберем подробнее:
sudo dd if=/dev/sr0 of=/opt/cd.iso — запустили программу dd для cоздания образа CD-диска с сохранением его в файл /opt/cd.iso
С помощью Ctrl-Z остановили dd, о чем вывелось сообщение ^Z и информация о задаче (ее номер 1, значок + означает, что она текущая, и что команды fg и bg будут касаться именно ее)
bg — возобновили текущую задачу (dd, которая находится в остановленном состоянии), но в фоновом режиме.
Выводится информация о задаче (по прежнему ее номер 1, значок + означает, что она текущая, отображается командная строка, которой задача была запущена, и знак того, что команда запущена в фоновом режиме & — обратите на это внимание)
Мы выполняем несколько действий, так как пока команда выполняется в фоновом режиме, командная строка предназначена нам.
type dd — узнали, какой тип команды у dd (встроенная, или внешняя). По тому, что выводится ее адрес в файловой системе, делаем вывод что она внешняя. То что адрес захеширован означает, что команда уже вызывалась и bash запомнил ее местоположение.
После чего выполняем jobs и узнаем, что у нас по прежнему одна задача и в каком она состоянии.
Далее dd завершает работу, о чем уведомляет нас (сообщая сколько скопировано байт и с какой скоростью).
После чего командный интерпретатор bash уведомляет нас о том, что фоновая задача с номером 1 завершена.
Есть другой способ запуска задачи в фоне. Без Ctrl-Z и bg.
Для это в конце команды поставить символ &. Тогда задача сразу будет выполняться в фоне, а командная строка остается доступной для пользователя.
Повторим ту же команду, добавив знак &:
sudo dd if=/dev/sr0 of=/opt/cd.iso &
Сразу был выведен номер задачи [1] и идентификатор запущенного процесса (2395)
Так как терминал не занят программой, мы можем выполнять другие команды, например, команду jobs.
После того, как программа отработает она выведет на экран информацию, и после нашего нажатия Enter сообщит, что задача завершена.
В разработке серверного ПО особенно такой способ применяется.
Программист компилирует программу, например myserver и запускает ее
myserver &
При этом строка остается доступна для ввода других команд.
Когда же программа отлажена, то для ее запуска создается юнит systemd, но это уже совсем другая история.
Подписывайтесь на мой канал и читайте заметки о неочевидных моментах в работе GNU/Linux и сетевых протоколов.
Всегда с вами,
Сергей Кручинин
преподаватель GNU/Linux и компьютерных сетей