Я пытаюсь создать init script в bash (Ubuntu), который запускает службу под определенным пользователем.
Есть ли лучший способ сделать это, кроме этого?
su - <user> -c "bash -c 'cd $DIR ;<service name>'"
Я пытаюсь создать init script в bash (Ubuntu), который запускает службу под определенным пользователем.
Есть ли лучший способ сделать это, кроме этого?
su - <user> -c "bash -c 'cd $DIR ;<service name>'"
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
.
Вы можете создать 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, которую я использую, но я предполагаю, что это средство будет доступно через дистрибутивы.
Надеюсь, это поможет!
У меня была такая же проблема, и я решил ее
Создайте 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