LINUX.ORG.RU

Как управлять работающим скриптом bash из php?

 ,


0

4

Хочу реализовать вот что: Имеется хостинг, на котором запущен скрипт bash и всё время работает. Скрипт ждёт из интернета пакеты определённого формата и кладёт их в базу данных My_SQL. Также на хостинге крутится сайт на php, который вынимает из этой базы пакеты, преобразует их и отображает на экране. Мне надо управлять работой указанного bash скрипта со страниц php. Я хотел реализовать это через переменные окружения bash, чтобы всё время работающий скрипт искал в них команды и выкладывал в них ответы. На страницах php будут кнопки, по нажатию которых будут запускаться простенькие bash'евские скрипты (командами passthru() или exec()), и эти простенькие скрипты будут класть команды всё время работающему скрипту в переменные окружения и вынимать его ответы из переменных окружения. Проблема в том, что когда я захожу в bash на хостинг по SSH и создаю там переменные оболочки или переменные окружения, то они живут только до момента, пока я не выйду из сессии SSH. Видимо надо просить хостера, чтобы он прописал мне дополнительные переменные окружения. На хостинге я не смог найти файлов, где я сам бы мог прописать дополнительные переменные окружения.

Вопрос: есть ли альтернативные способы управления работающим скриптом из php и работоспособна ли моя идея в теории?

P.S. Ещё думал организовать управление скриптом через My_SQL, т.к. и скрипт и страницы PHP имеют доступ к базе данных, они могут там оставлять сообщения друг-другу.

Переменные можно объявить в ~/.bashrc например.

И как вариант, если возможно изменить скрипт: управлять не переменными окружения, а, например, пиать нужные параметры в файлы или базу.

anonymous ()

Я хотел реализовать это через переменные окружения bash, чтобы всё время работающий скрипт искал в них команды и выкладывал в них ответы

Это невозможно (практически). Твой баш-скрипт работает в своём окружении, а пых в своём и просунуть в окружение другого процесса ничего нельзя. Нужно использовать какое-либо межпроцессное взаимодействие. Самый простой вариант - кидать скрипту сигнал, например SIGUSR1. Если нужно передавать какие-то данные, то сначала кладём нужные данные в файл, потом кидаем сигнал, баш скрипт по сигналу читает файл, выполняет нужные действия.

no-such-file ★★★★★ ()

Имеется хостинг, на котором запущен скрипт bash и всё время работает. Скрипт ждёт из интернета пакеты определённого формата и кладёт их в базу данных My_SQL.

На страницах php будут кнопки, по нажатию которых будут запускаться простенькие bash'евские скрипты

Я не знаю насколько это верно, но с данной постановкой задачи я бы сделал при нажатии на кнопку на веб-странице, создается симлинк в определенный каталог на конкретный простенький веб-скрипт. Далее из главного скрипта, сканирую каталог и если есть симлинк - значит пользователь запросил действие и мы его выполняем. Работать с скриптом можно через in/out потоки

kiotoze ★★★★ ()

Чтобы не делать лишних запросов можно узнавать о наличии новых команд по времени изменения файла базы данных.

anonymous ()

Ты хочешь использовать bash-builtin

source
, но лучше не надо.

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

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

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

только с использованием ОЗУ.

tmpfs + sqlite

anonymous ()

Ну, простейший, наверное, способ — через именованный канал (named pipe).

$ mkfifo myfifo
$ cat myscript

#!/bin/bash

hello ()
{
    printf 'Hi, %s!\n' "$1"
}

while read line; do
    hello "$line"
done < myfifo

$ ./myscript &
$ echo 'isden' > myfifo
Hi, isden!

В файловую систему при этом что-либо пишется только раз — при создании канала, сами данные ходят только через ОЗУ.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Спасибо, посмотрю в этом направлении. Ещё посмотрю на shm_open().

caferacer ()
Ответ на: комментарий от Zmicier

У FIFO есть ограничение на размер.

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

Если точнее, то у буфера канала есть ограничение на размер (суммарно-то пройти через него может сколько угодно).

А так — само собой. Мы же не со сферической машиной Тьюринга работаем. Один мегабайт:

$ /sbin/sysctl fs.pipe-max-size
fs.pipe-max-size = 1048576

Но можно и повысить, если сверхпользовательские права есть.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Именованный канал я запустил между двумя bash'евскими скриптами. Он работает, но в блокирующемся режиме, т.е. если читатель к каналу не подключился, то писатель при попытке записи в канал висит и ждёт. Пишут, что можно открыть канал в неблокирующемся режиме, но для этого надо открывать его командой открытия файла, где указать определённые атрибуты (только чтение, только запись, не важно). В bash'е я не нашёл команды открытия файла с указанием атрибутов. У меня в скрипте запись в канал идёт сразу через echo, без предварительного открытия канала как файла.

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

В Баше я не нашел...

Стоп. Вам это зачем? У вас же сценарий на Пэ-ха-пэ был.

Zmicier ★★★★★ ()
Ответ на: комментарий от Zmicier

Скрипт, которым управляют, один, это bash скрипт. Управление ведётся через php скрипты, которые в большом количестве запускаются и гаснут, когда пользователи сайта жамкают кнопки. У управляемого скрипта в итоге заполняется специальная таблица, с «пожеланиями» разных пользователей сайта, т.к. у них есть ID-шник и они его сообщают скрипту, когда ему шлют команду (это так, отступление).

Но это управление - это связь в оба конца, т.к. управляемый должен отчитаться о выполнении. Плюс, управляемый скрипт владеет некоей информацией, которую нужно отображать на страничках php, чтобы пользователь знал, жамкать ему кнопки или нет.

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

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

Вобщем, трубы не решат вопрос. Мне нужна именованная область ОЗУ.

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

В итоге, я переписал bash скрипт на PHP и делаю всё на

shmop_open()
и остальных shmop'ах. Правда, в настройках apache пришлось отдельно включать этот shmop.

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