Bash init - запуск сервиса под конкретным пользователем - PullRequest
11 голосов
/ 19 сентября 2011

Я пытаюсь создать сценарий инициализации в bash (Ubuntu), который запускает службу для определенного пользователя.

Есть ли лучший способ сделать это, кроме этого?

su - <user>  -c "bash -c  'cd $DIR ;<service name>'"

Ответы [ 4 ]

20 голосов
/ 31 июля 2013

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 здесь

4 голосов
/ 19 сентября 2011

Кроме того, вы можете использовать функцию daemon, определенную в вашем файле /etc/init.d/functions:

daemon --user=<user> $DIR/program

Если вы посмотрите на его синтаксис, вы можете сделать другие вещи, такие как определение местоположения файла PID, установка хорошего уровня и так далее. В остальном это действительно полезно для запуска сервисов в качестве демонов. Услуги, запущенные с daemon, могут быть легко прерваны другой функцией функций, killproc.

2 голосов
/ 19 сентября 2011

Вы можете создать сценарий под /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 голос
/ 09 ноября 2012

У меня была такая же проблема, и я решил ее с помощью

  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

...