Запуск программ в фоновом режиме на Linux
При работе в ОС семейства Linux бывают случаи, когда необходимо запустить некий долгий процесс, например поиск файла, и при этом вернуться к работе в консоли. Вполне разумным решением будет открыть несколько терминалов и выполнить каждую задачу индивидуально, но что если мы не ищем легких путей? В этом случае разумным было бы запустить процесс в фоновом режиме. Рассмотрим как это сделать двумя способами.
Для начала следует разобрать синтаксис командной строки. Запуск одной программы/скрипта и т.д. выполняем явным указанием, например:
ping 10.10.0.1
или
./script.sh
или
/home/admin/scripts/script.sh
Для запуска одной программы по завершении другой используется логический оператор && (двойной амперсанд), например:
mysqldump mybase -u user1 > db.sql && tar zcvf db.tar db.sql
Не очень удачный пример, так как можно было использовать перенаправление “|”, приблизительно это выглядело бы так:
mysqldump mybase -u user1 | tar -cvf db.tar -
Все эти примеры замечательны для использования в скриптах, однако запуск “долгих” процессов сделает терминал недоступным, как это было отмечено выше. В этом случае поможет следующий пример:
find / -iname “*.txt” > abc.list &
Именно одинарный & в конце строки, указанный через пробел.
Как видно, первая строка запускает процесс, но так как в системе мало txt-файлов, процесс завершается. Последующее нажатие Enter в терминале сообщает, что процесс успешно выполнен.
Рассмотрим другой вариант. Воспользуемся утилитой ping, результаты будем писать в файл.
Ввиду отсутствия ограничительных параметров у данной команды, ее выполнение прервется когда закончится место на жестком диске.
Завершение процесса через killall покажет что процесс не завершился самостоятельно, а был “убит”.
Контролировать фоновые процессы, в данном случае, можно командой:
jobs
<img width="819" height="485" src="https://lincore.kz/wp-content/uploads/2020/06/91_3.png" alt="" />
Сама команда jobs покажет сколько процессов выполняется и что именно выполняется, но различные ключи помогают отобразить больше информации. Ключ -l покажет еще и системный идентификатор процесса (PID). Ключ -p выведет только PID’ы, без описания.
Для перехода в приоритетный режим можно использовать команду fg 1 или %1.
Альтернативный способ.
Воспользоваться утилитой-мультиплексором screen. В некоторых дистрибутивах требуется установка.
CentOS:
yum install screen
Ubuntu:
apt-get install screen
Запуск команды прост:
screen
После выполнения появится окно, с ознакомительным текстом.
Нажимаем Enter.
Содержимое терминала обновится. Можем выполнить команду, например, все тот же ping. Чтобы вернуться в основной терминал нажимаем последовательно ctrl+a, а затем клавишу d.
В терминале появится сообщение, что процесс отделен.
Посмотреть запущенные screen’ы можно командой:
screen -list
<img width="819" height="485" src="https://lincore.kz/wp-content/uploads/2020/06/68_6.png" alt="" />
Возврат к процессу можно сделать командой:
screen -r
или
screen -r
В нашем случае:
screen -r 2636.pts-0.ubuntu
<img width="819" height="485" src="https://lincore.kz/wp-content/uploads/2020/06/47_7.png" alt="" />
Как видно, процесс выполнялся в фоновом режиме.
Иногда требуется скрипт, который запускал бы процесс в фоновом режиме при загрузке системы В таком случае следует воспользоваться следующим примером:
screen -d -m -S SCREEN_NAME program_1
-d -m - запускает процесс screen в отделённом режиме. Будет создана новая сессия, но она не будет показана.
-S - установит имя для процесса. Удобно, когда запущено несколько процессов screen.
Открыть окно с процессом можно командой:
screen -r my_ping