Подтвердить что ты не робот

Bash init - запуск службы под конкретным пользователем

Я пытаюсь создать init script в bash (Ubuntu), который запускает службу под определенным пользователем.

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

Вы можете создать script под /etc/init.d/ say your_service_name с минимальным содержимым

#!/bin/sh
su - <user> -c "bash -c 'cd $DIR ;<service name>'"

Предоставьте соответствующее разрешение script. Теперь используйте команду update-rc.d в требуемом каталоге /etc/rc<run_level>.d, чтобы создать мягкую ссылку для вашего script, чтобы script запускался, когда система запускается с указанным уровнем выполнения.
Пожалуйста, обратитесь к сценариям под /etc/init.d/ для справки и, пожалуйста, просмотрите /etc/init.d/README для получения более подробной информации о написании script. Страница пользователя для update-rc.d также поможет узнать об использовании update-rc.d. Это определенно работает на машине Ubuntu, которую я использую, но я предполагаю, что это средство будет доступно через дистрибутивы.
Надеюсь, это поможет!

Ответ 4

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

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

  • Установите коды запуска для script с помощью следующей команды
     sudo update-rc.d <my_scrpit> defaults

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

   root# ./etc/init.d/my_scrpit start