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, которую я использую, но я предполагаю, что эта возможность будет доступна через дистрибутивы.
Надеюсь это поможет!

У меня была та же проблема, и я решил ее

  1. Создайте скрипт bash и поместите его в /etc/init.d/, используя следующую схему
    #!/bin/bash
    su <user> -c "bash -c '<path to service> $1'"

  2. Настройте коды запуска для сценария с помощью следующей команды
    sudo update-rc.d <my_scrpit> defaults

Как только этот сценарий установлен в кодах выполнения, после перезапуска root запускает сценарий и передает старт / стоп сценарию как $1, в зависимости от состояния режима запуска.
Если вы хотите протестировать ваш скрипт без перезапуска, вы должны запустить его как root и передать действие сервиса, например, start / stop / restart....
root# ./etc/init.d/my_scrpit start

Другие вопросы по тегам