Фоновое иcполнение программ в Linux CLI.

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

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

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

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

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

1
>sleep 50 &

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

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

1
[1] Done sleep 50

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

1
[1]+ Terminated: 15 sleep 50

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

1
2
kill 5976  #убить по pid
kill %1 #убить первое задание

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

Пример:

1
2
3
4
5
>top &
[1] 5972
>jobs
[1]+ Stopped top # top останавливается в фоне
>fg 1

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

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

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

1
>bg 1

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

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

1
>nohup sleep 50 &

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

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

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

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

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

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

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

Пример:

1
2
3
4
> sleep 50
Ctrl+Z
> bg 1
> disown -h %1

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

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


Смотрите также

comments powered by Disqus