Как запустить одновременно два процесса linux
Перейти к содержимому

Как запустить одновременно два процесса linux

  • автор:

Как запустить две или более терминальных команды одновременно в Linux

Если вы используете Linux, вы знаете, насколько полезной может быть командная строка для работы с файлами, установки программного обеспечения и запуска программ. Но это может быть еще более эффективным, если вы запускаете несколько команд одновременно.

Объединение двух или более команд в командной строке также называется «объединением команд». Мы покажем вам различные способы объединения команд в командной строке..

Вариант первый: оператор с запятой (;)

Оператор точки с запятой (;) позволяет вам выполнять несколько команд подряд, независимо от того, была ли успешной каждая предыдущая команда. Например, откройте окно терминала (Ctrl + Alt + T в Ubuntu и Linux Mint). Затем введите следующие три команды в одну строку, разделенные точкой с запятой, и нажмите Enter. Это даст вам список текущего каталога ( Ls ), выясните, в каком каталоге вы сейчас находитесь ( PWD ) и отобразите ваше имя для входа ( кто я ) все сразу.

лс; pwd; кто я

Вам также не нужно ставить пробелы между точками с запятой и командами. Вы можете ввести три команды как Ls; PWD; Whoami . Однако пробелы делают комбинированную команду более читабельной, что особенно полезно, если вы помещаете комбинированную команду в сценарий оболочки.

Вариант второй: логический оператор И (&&)

Если вы хотите, чтобы вторая команда выполнялась только в том случае, если первая команда выполнена успешно, разделите команды с помощью логического оператора AND, который является двумя амперсандами ( && ). Например, мы хотим создать каталог с именем MyFolder, а затем перейти в этот каталог при условии, что он был успешно создан. Итак, мы вводим следующее в командной строке и нажимаем Enter.

mkdir MyFolder && cd MyFolder

Папка была успешно создана, поэтому CD команда была выполнена и мы теперь в новой папке.

Мы рекомендуем использовать логический оператор AND, а не точку с запятой большую часть времени ( ; ). Это гарантирует, что вы не делаете ничего катастрофического. Например, если вы запустите команду, чтобы перейти в каталог, а затем принудительно рекурсивно удалить все содержимое в этом каталоге ( cd / some_directory; rm -Rf * ), вы можете в конечном итоге разрушить вашу систему, если не произойдет смена каталога. Не рекомендуется запускать команду для безоговорочного удаления всех файлов в каталоге сразу.

Вариант третий: оператор логического ИЛИ (||)

Иногда вам может понадобиться выполнить вторую команду, только если первая команда выполняет не добиться успеха. Для этого мы используем логический оператор ИЛИ или две вертикальные черты ( || ). Например, мы хотим проверить, существует ли каталог MyFolder ( [-d ~ / MyFolder] ) и создайте его, если это не так ( mkdir ~ / MyFolder ). Итак, мы вводим следующую команду в командной строке и нажимаем Enter.

[-d ~ / MyFolder] || mkdir ~ / MyFolder

Убедитесь, что после первой скобки и перед второй скобкой есть пробел или первая команда, которая проверяет, существует ли каталог, не будет работать.

В нашем примере каталог MyFolder не существует, поэтому вторая команда создает каталог.

Объединение нескольких операторов

Вы также можете объединить несколько операторов в командной строке. Например, мы хотим сначала проверить, существует ли файл ( [-f ~ / sample.txt] ). Если это произойдет, мы выводим на экран сообщение о том, что echo «Файл существует» ). Если нет, мы создаем файл ( коснитесь ~ / sample.txt ). Итак, мы вводим следующее в командной строке и нажимаем Enter.

[-f ~ / sample.txt] && echo «Файл существует.» || коснитесь ~ / sample.txt

В нашем примере файл не существует, поэтому он был создан.

Вот полезная сводка по каждому из операторов, используемых для объединения команд:

  • А; В — Запустите A, а затем B, независимо от успеха или неудачи A
  • A && B — Запускайте B, только если успешно
  • A || В — Запустите B только в случае сбоя

Все эти методы объединения команд также можно использовать в сценариях оболочки как в Linux, так и в Windows 10..

Вы также можете автоматически исправлять орфографию и опечатки при использовании «cd» в командной строке в Linux, чтобы избежать кардинальных последствий при объединении команд.

Как запустить два процесса одновременно

Здравствуйте! Мне необходимо запустить одновременную трансляцию видео- и аудиопотоков на определенный IP. Подскажите пожалуйста, как запустить два процесса одновременно:

arecord -f cd -D plughw:1,0 | ffmpeg -i — -acodec libmp3lame -ab 8k -ac 1 -re -f rtp rtp://192.168.0.101:8082

avconv -f video4linux2 -s 160×120 -v debug -i /dev/video0 -vcodec mpeg2video -r 25 -pix_fmt yuv420p -me_method epzs -b 2600k -bt 256k -f rtp rtp://192.168.0.101:8083

Каждый из них безостановочно вываливает кучу сообщений и запустить второй процесс одновременно с первым, пока тот не закончится, не получается. Подскажите пожалуйста, как это организовать в скрипте.

Как запустить 3 терминала с разными командами одновременно ? желательно в одном окне, типа Tmux

для работы локально нужно запускать 3 терминала с разными командами в каждом, может есть вариант использовать Tmux для этого или что то аналогичное ? Запуск галпа, трек лога ошибок, и команды перезапуска служб

Отслеживать
задан 23 окт 2021 в 9:35
368 2 2 серебряных знака 13 13 бронзовых знаков

В tmux команда Ctrl+b » — создает новую панель в текущем окне деля текущую панель горизонтально. Ctrl+b % тоже самое, только делит вертикально. Ctrb+b курсор — передвижение между панелями.

23 окт 2021 в 11:22

вопрос был как при перезагрузке компьютера, поднять такую же сессию с этими же командами в созданных терминалах в tmux. Разве он умеет создавать не только пустые терминалы ?

23 окт 2021 в 11:33
В вашем попросе ни слова о автозапуске после перезагрузки. Это нужно добавить
23 окт 2021 в 12:58

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Запустите в терминале screen

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

введите сюда описание изображения

$ screen -S SomeName — создать новый сеанс. В сеансе может быть любое количество интерактивных сессий, которые будут спокойно работать в фоне и ждать вашего переключения.

Если внутри сеанса screen нажать Ctrl-a d , то сеанс уйдёт в фон, а вас вернёт обратно в тот шелл, из которого был запущен screen . Это капец как удобно для управления сервером по ssh. Зашел, активировал фоновый сеанс командой $ screen -r SomeName , поработал, нажал Ctrl-a d , закрыл ssh. Канал закрыт, а оно на том конце и не заметило, что пользователь отключился.

Внутри screen клавиши Ctrl-a c создают новую интерактивную сессию, а клавиши Ctrl-a 0 , Ctrl-a 1 , Ctrl-a 2 . — переключают между ними по номерам: 0 (самый первый), 1, 2 и так далее.

Более того, можно поделить экран консоли на области и на них будут параллельно выводиться интерактивные сессии.

CTRL-a | — разделить текущую панель по вертикали, CTRL-a S — по горизонтали. CTRL-a TAB — переключиться в следующую панель.

Возможностей много, мануал толстый. Я, если честно, пользуюсь только возможностями сворачивать сеансы на время, и переключением между сессиями внутри сеанса по Ctrl-a 0,1,2,3.

Сохранить и восстановить сеанс screen можно командой screen_session

Можно создать конфигурационный файл, в котором прописать запуск процессов в сессиях. Что-то вроде такого:

screen -t "Server" sh -c "cd . ; server" screen -t "Bash" screen -t "Logs" sh -c "cd . ; tail -f log.file" 

Запуск с кастомным конфигом: screen -c config.file

Работа с процессами в Linux

Управление процессами является неотъемлемой частью администрирования серверных систем под управлением ОС Linux. В этой практической статье мы рассмотрим примеры решения различных задач по управлению процессами.

Вообще, процесс, как и файл является фундаментальной абстракцией ОС Linux. То есть, без процессов невозможно функционирование данной (как, впрочем, и любой другой) операционной системы.

В рамках данной статьи я не буду сильно погружаться в теорию и рассказывать о том как процессы взаимодействуют с операционной системой и пользователем. На эту тему уже написано достаточно публикаций. Вместо давайте посмотрим, как на практике можно работать с процессами. В качестве тестовой ОС как обычно выступает ОС Linux Ubuntu 22.04.

Получаем список процессов

Каждый процесс имеет свои атрибуты. Это прежде всего идентификатор процесса (PID), также это образ, исполняемый файл, статус выполнения, атрибуты безопасности и т.д.

Получить список процессов с основными атрибутами можно с помощью команды:

Если необходимо получить информацию по конкретному процессу, то можно воспользоваться командой:

sudo ps -p PID_процесса u

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

В результате мы получаем дерево процессов, в котором видно какой процесс является родительским для других процессов. Конечно, такую зависимость можно построить и на основании вывода ps сопоставив значение поля PPID (родительский процесс) интересующего процесса с PID соответствующего процесса. Но в виде дерева все выглядит гораздо нагляднее.

Приоритетные и фоновые процессы

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

Для таких случаев лучше использовать фоновые процессы. Такие процессы не занимают текущий терминал, то есть мы можем одновременно с выполнением фонового процесса работать с другими командами, запускать процессы и т.д. Фоновый процесс также называется Заданием (Job).

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

После запуска выведется строка с номером задания (в скобках) и PID, появится приглашение на ввод команды в текущем терминале. При этом, номера заданий относятся только к текущему терминалу.

Однако, выполнение этой команды завершится слишком быстро, поэтому для дальнейших примеров я использую скрипт, использующий бесконечный цикл с условием while true…

После запуска в фоновом режиме посмотреть выполнение задание можно с помощью команды jobs:

Приоритетные задачи можно также превращать в фоновые и возвращать обратно в приоритетные.

В качестве примера я снова запущу свой скрипт. Нажатие Ctrl-Z приведет к остановке данного процесса. На рисунке ниже это вывод первой команды jobs. Далее остановленный процесс можно снова запустить в фоновом режиме с помощью команды bg (background). Во втором выводе jobs скрипт запущен со знаком &. И для того, чтобы вернуть процесс в фоновый режим воспользуемся командой fg (foreground).

Вообще, команды fg и bg переводят из/в фоновый режим задание с указанным номером. Но, если номер не указан, действие применяется к последнему созданному заданию, как в нашем случае.

В случае, если нам необходимо завершить процесс, проще всего воспользоваться командой

Однако возможны ситуации, когда процесс может проигнорировать передаваемый ему командой KILL сигнал SIGTERM и не завершить свою работу. В таком случае мы можем воспользоваться командой:

kill -9 PID_процесса

В таком случае передается более мощный сигнал SIGKILL, который нельзя проигнорировать или заблокировать. Как жаль, что такой команды нет в Windows.

Виртуальная файловая система procfs

Виртуальная файловая система procfs, как можно понять из названия расположена только в памяти и не хранится на жестком диске постоянно. Доступ к ней можно получить, обратившись к каталогу /proc.

Как можно увидеть, в этом каталоге содержатся подкаталоги, соответствующие PID процессов. У каждого процесса есть своя запись в /proc с идентификатором в названии. В каждом из этих подкаталогов можно найти ряд файлов, связанных с данным процессом.

Вот основные файлы, которые есть в каждом каталоге процесса:

cmdline — полная командная строка процесса.

В примере для демона SSH видим следующее:

cwd — символьная ссылка на текущий каталог процесса.

exe — символьная ссылка на файл, который должен выполняться.

environ — переменные среды процесса.

fd — содержит ссылку на дескрипторы каждого открытого файла.

Конечно, это не исчерпывающий список тех файлов, которые находятся в каталоге каждого из процессов, так как там можно встретить еще множество файлов, типичных для того, или иного процесса.

Заключение

В этой статье были рассмотрены практические аспекты работы с процессами в ОС Linux. За рамками этой статьи осталась работа с приоритетами и сигналами и многое другое, что будет рассмотрено в следующей статье.

А на бесплатном уроке специализации Linux мои коллеги из OTUS расскажут про базовые команды в Linux. Зарегистрироваться на вебинар можно по этой ссылке.

  • Блог компании OTUS
  • Настройка Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *