Linux: пользовательские демоны / сервисы
Я ищу фреймворк / библиотеку / среду, чтобы обычный пользователь мог настроить свои собственные серверные процессы. Эти процессы должны запускаться под его uid, как и любой другой пользовательский процесс.
Однако определение того, какие процессы должны быть запущены, с аргументами, которые они получают и т.д., должно быть задано обычным пользователем без дополнительных привилегий. Для меня важно, чтобы это происходило без необходимости для пользователя фактически входить в систему. В идеале это должно работать с SYSV init, но с системным интерфейсом тоже все в порядке.
Примеры / варианты использования:
- nginx uwsgi / быстрые процессы cgi
- экземпляры Mongodb
- разные компоновщики для сервера непрерывной интеграции
Все это имеет то общее, что я могу запустить несколько экземпляров одного и того же двоичного файла (с разными параметрами) и что эти параметры могут нуждаться в регулярных изменениях. Однако пользователи должны иметь возможность настраивать все это, не требуя привилегий root.
Любые предложения / указатели, как это может быть реализовано в Linux?
РЕДАКТИРОВАТЬ: минимальное требование - просто запустить пользовательские процессы, но, очевидно, будет необходимость в более совершенных механизмах управления. Например, должен быть простой способ запрашивать, работает ли служба, останавливать экземпляр, перезапускать его, перезагружать, ...
3 ответа
cron
предусматривает это с @reboot
префикс (Vixie, и, возможно, другие ароматы, проверьте man 5 crontab
). Пользователь будет использовать crontab
создать / отредактировать собственный файл crontab и указать
@reboot /some/path/command -flags --moreflags
Который будет запускать эту команду при запуске, как этот пользователь.
Это будет около 10 строк сценария оболочки, зачем вам фреймворк / библиотека / среда?
В качестве быстрого примера, используя sysV init....
#!/bin/bash
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
DAEMON_USERS=`cat /etc/daemon_users`
CMD="$1"
for DUSER in $DAEMON_USERS ; do
DSCRIPTS=`ls /home/${DUSER}/init/`
for DFILE in DSCRIPTS ; do
if [ -x "/home/${DUSER}/init/${DFILE}" -a ! -d "/home/${DUSER}/init/${DFILE}" ]
then
su -c $DUSER /home/${DUSER}/init/${DFILE} $CMD
fi
done
done
Если вы действительно хотите разрешить им запускать вещи от имени пользователя root, то удалите 'su -c $DUSER' и добавьте их в sudoers, чтобы они могли перезапускать / добавлять вещи без перезагрузки.
Итак... просто запустите приложение от имени пользователя, от которого вы хотите его запустить, и не пытайтесь получить доступ к чему-либо, для чего требуется root (например, к привилегированным портам, файлам, которые могут быть прочитаны только root и т. Д.)?
Если вы хотите автоматически запускать эти демоны и управлять ими через процесс инициализации SysV, вам потребуется создать сценарий инициализации для каждого из них, который задает параметры (или читает их из файла, к которому непривилегированный пользователь имеет доступ для записи). и запускает демон, используя su -c
или аналогичный, но ОСТОРОЖНО: выполнение этого имеет СЕРЬЕЗНЫЕ последствия для безопасности (тщательно созданный файл "параметров" может позволить пользователю выполнить произвольный код как пользователь, выполняющий вашу последовательность инициализации, которая обычно является пользователем root).
ДерфК упомянул хрон @reboot
вариант, который может быть лучшим выбором (меньше угрозы безопасности), но ваши администраторы должны знать, что эти программы будут запускаться cron...