Как создать службу Linux, которая принимает команды через веб-сервер? - PullRequest
4 голосов
/ 12 июня 2009

Мне нужно, чтобы приложение работало в фоновом режиме на моем веб-сервере, но мне нужно иметь возможность запускать / останавливать приложение с привилегиями root.

Для этого я хочу, чтобы у меня была запущена служба с привилегиями root, чтобы она могла убить приложение и запустить его снова, если это необходимо.

Наконец, мне нужно иметь возможность отправлять команды запуска и уничтожения в службу через Apache / PHP, чтобы им можно было косвенно управлять через Интернет.

Как мне создать службу Linux?
Как я могу общаться со службой Linux таким образом?

Заранее спасибо!

Ответы [ 8 ]

6 голосов
/ 12 июня 2009

Используйте команду exec в вашем PHP-скрипте для вызова файлов оболочки. Файлы оболочки можно настроить с помощью бита «setuser», чтобы он работал как владелец (вместо того, чтобы запускаться с разрешениями веб-сервера).

Конечно, вам нужно быть очень осторожным - много тестов, мониторинга и т. Д.

Наконец, подумайте о сервисе, работающем как выделенный пользователь, а не как root. Например, как apache и большинство других хорошо сделанных сервисов.

Добавлено: Re: запуск службы в Linux. Зависит от вашего вкуса Linux. Если вы хотите быть уверены, что ваша служба приложения будет автоматически перезапущена в случае сбоя, а также войдите в систему, извлеките Runit:

https://web.archive.org/web/1/http://blogs.techrepublic%2ecom%2ecom/opensource/?p=202

http://smarden.org/runit

Добавлено: вместо бита setuid я думаю, что предложение Фрэнка (в комментарии) об использовании системы sudo лучше.

3 голосов
/ 12 июня 2009

Итак, у вас есть три части здесь:

  • Ваш веб-сервер без прав root
  • Заявка
  • Демон, контролирующий приложение

Ваша проблема не в том, чтобы запустить демон, а в том, что он записывает его и связывается с ним с веб-сервера без необходимости получения прав root.

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

# my_dameon &

Я не разработчик php, но в поисках очереди сообщений и php я обнаружил beanstalkd
Глядя на пример на первой странице, кажется, что вы можете использовать его для выполнения следующих действий:

  • apache / php отправляет некоторое сообщение beanstalkd
  • Ваш демон читает сообщение от beanstalkd. На основании этой команды он запускает или уничтожает или перезагружает фоновое приложение.

Вы можете написать своего демона на php, так как есть клиент на многих языках
Вы также можете проверить этот вопрос

1 голос
/ 29 октября 2009

Как подсказывает @shodanex, использование Beanstalkd было бы отличным способом отключить веб-интерфейс от работника из командной строки, работающего от имени пользователя root. Можно просто установить, чтобы он выполнял только то, что требовалось.

Чтобы запустить работника, System_Daemon * Pear может сгенерировать и запустить скрипт, запускающий демон, с помощью start / stop / restart.

1 голос
/ 12 июня 2009

Что касается связи со службой, то вы не сказали, что это за услуга, однако, предполагая, что вы пишете ее самостоятельно, наиболее распространенными методами было бы установление связи через сокеты UNIX или MMAP. Зависит от ваших потребностей действительно.

О, да, стоит отметить, что уже есть приложения для веб-управления системами Linux. Webmin - действительно хороший инструмент, который можно настроить так, чтобы он позволял вам контролировать столько, сколько вам нужно.

1 голос
/ 12 июня 2009

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

1 голос
/ 12 июня 2009

Вы можете создать демон, который принимает следующие команды:

  • daemon_name start
  • daemon_name stop
  • daemon_name restart
  • deamon_name reload

Запуск демона не должен быть сложным. Выполнение daemon_name start из сценария PHP должно запустить его. После запуска вы можете записать PID процесса в файл блокировки (для остановки, перезапуска или перезагрузки позже). Демон должен обрабатывать сигналы.

В сценарии PHP вы можете вызвать daemon_name stop. Это должно запустить нового демона, который проверит файл блокировки, получит PID запущенного демона и отправит сигнал, который будет обработан запущенным демоном. Файл блокировки должен быть удален / очищен, и затем демон / процесс, инициирующий stop, может выйти.

0 голосов
/ 09 мая 2012

Конечно, с

sudo apt-get install openbsd-inetd

Вы можете создать услугу, которую хотите

0 голосов
/ 12 июня 2009

При этом будьте очень, очень осторожны. Никогда не используйте данные, отправленные пользователем из Интернета, в команде exec. это может позволить кому-то произвольно выполнять команды на вашем компьютере.

Также я второй Фрэнк использую правило sudo, чтобы вы могли запускать эту конкретную команду с необходимыми разрешениями, но не более того. Так будет безопаснее.

...