LINUX.ORG.RU

Межпроцессное взаимодействие в Linux

 , , ,


0

1

Доброго времени суток!

Подскажите, пожалуйста, каким образом на любом скриптовом языке в Linux проще всего реализовать следующее (не используя REST API)?

Допустим есть скрипт script1, которые работает в фоне и слушает обращения к нему, в этом скрипте есть функции, например:

function one() {
  printf 1  
}

function two() {
  printf 2
}

Есть скрипт script2, в котором должен выполняться запрос к скрипту script1, для вызова определённой функции из него, например, если выполняем:

./script2

Выполняется функция two() в скрипте script1, возвращается ответ от него, после чего script2 завершается, а script1 продолжает слушать запросы.

Спасибо!

Ответ на: комментарий от Anoxemian

Спасибо за подсказку, но те примеры, что я нахожу обычно используют решения с HTTP-запросами и прослушиванием какого-либо порта. Можно ли сделать как-то по-другому?

ameame2021
() автор топика
Ответ на: комментарий от ameame2021

Можно ли сделать как-то по-другому?

Именованные каналы. Но лучше через «решения с HTTP-запросами и прослушиванием какого-либо порта».

vvn_black ★★★★★
()

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

tvldslv
()

Вариант bash при помощи программы socat:

script1

#! /bin/bash

if [[ "$1" == 'server' ]]; then
    socat UNIX-LISTEN:/tmp/script1.socket,fork exec:$0
    exit
fi

function one() {
    printf "1\n"
}

function two() {
    printf "2\n"
}

read cmd
case "$cmd" in
    'one' ) one;;
    'two' ) two;;
    * ) echo "unknown command '$cmd'";;
esac

script2

#! /bin/bash

reply=$(echo "$1" | socat UNIX-CONNECT:/tmp/script1.socket -)
echo "$reply"

в одном терминале запустить

./script1 server

в другом

./script2 one
./script2 two
./script2 three
No ★★
()
Последнее исправление: No (всего исправлений: 1)

если баш то можно netcat заюзать http://rus-linux.net/MyLDP/lvs/useful_netcat_examples_on_linux.html если иное удобнее родные сетевые библиотеки или через фифу =) http://rus-linux.net/MyLDP/consol/An_introduction_to_pipes_in_Linux.html Да куча вариантов, просто активно погугли и выбери из множества что более удобно будет и понятнее. Ибо взаимодействие можно организовать через что угодно что пересылает данные, то есть вообще через всё например через переименование файла в каталоге или количество значков на твоём рабочем столе хехе =) Или просто то что созданно именно для этого https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BA%D0%B5%D1%82_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0_Unix

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Ну как бы все уже сказали - при помощи любого IPC.

А дальше все зависит от специфики задачи. На сокетах в рамках одного хоста это делается тривиально, и может масшатбироваться за рамки хоста.

http://a-iv.ru/pyart/mysocket-I.pdf

AntonI ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.