Bash init - запуск сервиса под конкретным пользователем
Я пытаюсь создать сценарий инициализации в bash (Ubuntu), который запускает службу под конкретным пользователем.
Есть ли лучший способ сделать это, кроме этого?
su - <user> -c "bash -c 'cd $DIR ;<service name>'"
4 ответа
Ubuntu использует start-stop-daemon
который уже поддерживает эту функцию.
Используйте файл скелета из /etc/init.d:
sudo cp /etc/init.d/skeleton /etc/init.d/mynewservice
Отредактируйте mynewservice соответствующим образом.
Добавьте следующий параметр в строки, которые вызывают start-stop-daemon:
--chuid username:group
Пример:
+ Изменить
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
в
start-stop-daemon --start --quiet --chuid someuser:somegroup --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
Наконец, зарегистрируйте свой сервис и запустите его:
update-rc.d mynewservice defaults 99 && service mynewservice start
Больше информации о других опциях start-stop-daemon здесь
Кроме того, вы можете использовать daemon
функция, определенная в вашем /etc/init.d/functions
файл:
daemon --user=<user> $DIR/program
Если вы посмотрите на его синтаксис, вы можете сделать другие вещи, такие как определение местоположения файла PID, установка хорошего уровня и так далее. В остальном это действительно полезно для запуска сервисов в качестве демонов. Услуги запущены с daemon
может быть легко завершен другой функцией функции, killproc
,
Вы можете создать скрипт под /etc/init.d/
скажем your_service_name, с минимальным содержанием
#!/bin/sh
su - <user> -c "bash -c 'cd $DIR ;<service name>'"
Предоставьте соответствующее разрешение сценарию. Сейчас использую update-rc.d
команда в требуемом /etc/rc<run_level>.d
каталог для создания программной ссылки для вашего скрипта, чтобы скрипт запускался при запуске системы с упомянутым уровнем запуска.
Пожалуйста, обратитесь к сценариям под /etc/init.d/
для справки и пройдите /etc/init.d/README
для более подробной информации о написании сценария. Справочная страница для update-rc.d
также поможет узнать об использовании update-rc.d
, Это определенно работает на машине Ubuntu, которую я использую, но я предполагаю, что эта возможность будет доступна через дистрибутивы.
Надеюсь это поможет!
У меня была та же проблема, и я решил ее
Создайте скрипт bash и поместите его в /etc/init.d/, используя следующую схему
#!/bin/bash
su <user> -c "bash -c '<path to service> $1'"
Настройте коды запуска для сценария с помощью следующей команды
sudo update-rc.d <my_scrpit> defaults
Как только этот сценарий установлен в кодах выполнения, после перезапуска root запускает сценарий и передает старт / стоп сценарию как $1, в зависимости от состояния режима запуска.
Если вы хотите протестировать ваш скрипт без перезапуска, вы должны запустить его как root и передать действие сервиса, например, start / stop / restart.... root# ./etc/init.d/my_scrpit start