2015-11-28 5 views
1

Есть ли обычный способ написать программу, чтобы команды могли выдаваться программе из командной строки без repl? Например, как вы можете посылать команды на запущенную nginx сервера, используя sudo /etc/init.d/nginx restart (или любой другую действительной команду, кроме restart)Каким образом можно отправлять команды запущенным процессам?

Одна идеи, которую я имел имели продолжительную программу создания и мониторинг Сокета, что другие программы могут писать для отправки команд. Другим было создание локального сервера с интерфейсом REST, который может быть отправлен командами таким образом, хотя это кажется немного грубым.

Каков правильный способ сделать это?

+0

Обратите внимание, что работающая программа должна быть оборудована для обработки сообщений. Есть много способов сделать это, но любой выбранный метод должен быть закодирован в запущенную программу. Например, не существует способа заставить долговременный сценарий оболочки изменять свое поведение (кроме очень грубо, убивая его сигналом или не так грубо, добавляя отладчик, но для этого требуются привилегии), пытаясь обмениваться данными с ним из другого процесса. Как правило, тогда дизайн запущенной программы будет определять, как вы организуете вещи. –

ответ

2

Оба способа в порядке, и вы даже можете рассмотреть возможность использования какого-либо оборудования RPC, такого как приложение, которое подает JSONRPC на разъеме unix(7). Или используйте fifo(7). Или используйте D-Bus.

Общей привычкой в ​​Unix является то, что приложения перезагружают свои файлы конфигурации, например. SIGHUP и сохраните некоторое постоянное состояние (до завершения) на SIGTERM. Прочитайте signal(7) (обратите внимание, что только обработчики с поддержкой асинхронного сигнала могут быть вызваны обработчиками сигналов, а хороший способ - установить только переменную volatile sig_atomic_t внутри обработчика и протестировать ее снаружи). См. Также документацию POSIX signal.h.

Вы можете сделать ваше приложение станет специализированным сервером HTTP (например, с помощью некоторых библиотеки HTTP-сервера, как libonion) и дать ему некоторые веб-интерфейс (или REST или SOAP ...); пользователь (или sysadmin) будет использовать свой браузер для взаимодействия с вашим приложением.

Вы можете сделать ваш сервер systemd совместимым. (Я не знаю точно, что это требует, возможно, это связано с D-bus).

Вы можете встроить некоторый интерпретатор команд (например, GuileLua и) в вашем приложении и иметь некоторый ограниченный вид REPL петли работает на каком-то IPC как сокет или ФИФО. Остерегайтесь неприятного code injection.

+0

У вас также есть SIGUSR1 и 2, с которыми я бы предложил вместо неожиданного с HUP или TERM. – Sobrique

Смежные вопросы