mkfifo: обмен данными между процессами через именованные каналы
Обычный pipe:
command1 | command2
работает только пока запущены обе команды. Но иногда нужен постоянный канал, к которому разные процессы могут подключаться позже.
Для этого в Linux есть FIFO (named pipe).
▪️Создание именованного канала
mkfifo /tmp/my_pipe
Теперь /tmp/my_pipe выглядит как файл:
ls -l /tmp/my_pipe
Вывод:
prw-r--r-- 1 user user 0 Aug 4 12:00 my_pipe
Буква p означает pipe.
▪️Передача данных между двумя процессами
Терминал 1:
cat /tmp/my_pipe
Терминал 2:
echo "hello from process" > /tmp/my_pipe
Первый процесс сразу получит сообщение.
▪️Пример с логированием
Можно отправлять события из одного скрипта в другой:
mkfifo /tmp/events.pipe
tail -f /var/log/app.log > /tmp/events.pipe &
А отдельный обработчик:
while read line; do
echo "EVENT: $line"
done < /tmp/events.pipe
Теперь обработка логов отделена от источника данных.
▪️Важный момент
FIFO блокирует процесс:
echo "data" > /tmp/my_pipe
будет ждать, пока кто-то откроет канал на чтение.
Поэтому в автоматизации часто используют фоновые процессы:
cat /tmp/my_pipe &
echo "start" > /tmp/my_pipe
▪️Чем отличается от обычного файла
Данные в FIFO не сохраняются на диске.
Если никто не читает:
процесс → FIFO → процесс
данные не складываются в очередь, а ждут получателя.
▪️Где полезно
• связь между Bash-скриптами;
• простые IPC-механизмы;
• обработка потоков данных;
• разделение генератора и обработчика.
▪️Почему это важно
mkfifo часто заменяет временные файлы и сложные конструкции с перенаправлениями. Это простой способ построить связь между независимыми процессами прямо средствами Linux без дополнительных сервисов.
BashTex 📱 #mfifo
Обычный pipe:
command1 | command2
работает только пока запущены обе команды. Но иногда нужен постоянный канал, к которому разные процессы могут подключаться позже.
Для этого в Linux есть FIFO (named pipe).
▪️Создание именованного канала
mkfifo /tmp/my_pipe
Теперь /tmp/my_pipe выглядит как файл:
ls -l /tmp/my_pipe
Вывод:
prw-r--r-- 1 user user 0 Aug 4 12:00 my_pipe
Буква p означает pipe.
▪️Передача данных между двумя процессами
Терминал 1:
cat /tmp/my_pipe
Терминал 2:
echo "hello from process" > /tmp/my_pipe
Первый процесс сразу получит сообщение.
▪️Пример с логированием
Можно отправлять события из одного скрипта в другой:
mkfifo /tmp/events.pipe
tail -f /var/log/app.log > /tmp/events.pipe &
А отдельный обработчик:
while read line; do
echo "EVENT: $line"
done < /tmp/events.pipe
Теперь обработка логов отделена от источника данных.
▪️Важный момент
FIFO блокирует процесс:
echo "data" > /tmp/my_pipe
будет ждать, пока кто-то откроет канал на чтение.
Поэтому в автоматизации часто используют фоновые процессы:
cat /tmp/my_pipe &
echo "start" > /tmp/my_pipe
▪️Чем отличается от обычного файла
Данные в FIFO не сохраняются на диске.
Если никто не читает:
процесс → FIFO → процесс
данные не складываются в очередь, а ждут получателя.
▪️Где полезно
• связь между Bash-скриптами;
• простые IPC-механизмы;
• обработка потоков данных;
• разделение генератора и обработчика.
▪️Почему это важно
mkfifo часто заменяет временные файлы и сложные конструкции с перенаправлениями. Это простой способ построить связь между независимыми процессами прямо средствами Linux без дополнительных сервисов.
BashTex 📱 #mfifo