Думаю, что ни для кого не секрет, что с помощью командной строки 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, но после завершения сессии терминала, задание продолжит свое выполнение.
На этом все, спасибо за внимание.
Смотрите также
- maybe? Интересная песочница для отладки операций с файлами в скриптах Linux.
- Знакомство с CMake. Часть 1. Установка, CMakeLists.txt, сборка.
- Упрощаем администрирование с etckeeper. Настройка контроля версий конфигов в /etc.
- HTTPS для сайта на WordPress под управлением nginx.
- Тестирование производительности веб серверов. Часть первая. Apache Benchmark (ab).