Думаю, что ни для кого не секрет, что с помощью командной строки Linux можно решить любые задачи, в том числе и те, решение которых совсем нетривиально, а порой и невозможно без дополнительного ПО в Windows. В последнее время все больше людей переходят на Linux/Mac системы, при этом в большинстве своем даже не представляют той мощи, которую дает командная строка. Windows даже с PowerShell курит в сторонке.

Этой статьей я начинаю цикл «Linux для начинающих», в котором периодически буду описывать полезности, которые очевидны и просты, но многие новички даже не догадываются об их существовании.

Linux, Mac OS, BSD — многозадачные операционные системы. Это распространяется не только на демонов, но и на наши приложения. Например в одной сессии можно поставить что-нибудь на копирование, параллельно продолжая заниматься своими делами, при этом получая в CLI возможные возникающие ошибки.

Управление фоновыми задиниями осуществляется с помощью команд fg, bg, jobs, nohup и disown.

Для того, чтобы запустить приложение сразу в фоновом режиме, добавим в конце строки &. Пример:

 

После того, как мы нажмем Enter, нам вернется строка формата [job_id] pid.

Используя команду jobs мы можем посмотреть список заданий в фоне и их статус. Например через 50 секунд после запуска предыдущего примера, введя jobs мы увидим следующее:

 

Если мы терминируем программу до окончания ее выполнения, это отобразиться так:

 

Убить фоновое задание можно с помощью kill, в качестве аргумента используя либо pid, либо номер задания:

 

Команда fg вытащит задание из фона.

Пример:

 

Конечно удобно запускать программы в фоне, но как быть, если нам потребуется отправить ее туда уже во время ее выполнения?

Для этого воспользуемся сочетанием клавиш Ctrl+Z. После нажатия выполнение программы приостановится и она поместится в фон, о чем сообщит выдав соответствующее уведомление.

Нам останется продолжить ее выполнение с помощью команды bg:

 

Теперь задание запущено в фоновом режиме.

Когда мы закроем окно терминала, все фоновые задания завершатся. Для того, чтобы избежать этого, используем команду nohup.

 

После запуска мы увидим сообщение, что стандартный вывод перенаправлен в файл $HOME/nohup.out. Теперь смело можем закрывать терминал.

Данный прием работает, если мы сразу знаем, что задание нужно будет выполнить после завершения сессии, но что-же делать, если мы не рассчитали времени на выполнение какого либо приложения, а нам срочно нужно закрыть терминал? Это особенно актуально для ssh соединений. В этом случае на помощь нам придет команда disown.

Синтаксис команды:

disown [-ar] [-h] [jobspec …]

Ключ a  — применить ко всем заданиям.

Ключ r  — применить ко всем запущенным заданиям.

Ключ h —  оставить задание в списке jobs.

Пример:

 

Теперь программа будет по прежнему отображаться в jobs, но после завершения сессии терминала, задание продолжит свое выполнение.

На этом все, спасибо за внимание.