Запуск сервиса от имени юзера и в нужном проекте.

Нужно создать и запустить сервис (на примере teamcity) в проекте с ограничениями.

Тестовый стенд: Solaris 11.1

1) Создание проекта.

Создаём такой проект с уже нужными ограничениями:

# projadd -U webservd -K 'rcap.max-rss=3GB' -K 'project.max-lwps=(privileged,400,deny)' -K 'project.max-tasks=(privileged,400,deny)' -K 'process.max-file-size=(priv,1Gb,deny)' -K 'process.max-core-size=(priv,1Gb,deny)' -K 'project.cpu-shares=(privileged,1,none)' -K 'project.cpu-cap=(privileged,10,deny)' java

Если что-то забыли, в последствии можно добавить так:

# projmod -a -K ... java

Параметр -a означает append (добавить). Если его не указать, то выполнится перезатирание всего на только то, что будет указано. Проверяем:

# projects -l java
java
        projid : 100
        comment: ""
        users  : webservd
        groups : (none)
        attribs: process.max-core-size=(priv,1073741824,deny)
                 process.max-file-size=(priv,1073741824,deny)
                 project.cpu-cap=(privileged,10,deny)
                 project.cpu-shares=(privileged,1,none)
                 project.max-lwps=(privileged,400,deny)
                 rcap.max-rss=3221225472

Поскольку мы включили ограничение по памяти, то нужно включить демон rcapadm:

# rcapadm -E

2) Создание и запуск сервиса.

Создаём сервис, но не запускаем его (так как нам нужно будет указать юзера, проект для запуска):

# svcbundle -i -s service-name=application/teamcity -s model=daemon -s start-method="/opt/teamcity/bin/runAll.sh start" -s stop-method="/opt/teamcity/bin/runAll.sh stop" -s enabled=false

Правим нужные свойства:

# svccfg -s teamcity setprop start/user = astring: webservd
# svccfg -s teamcity setprop start/group = astring: webservd
# svccfg -s teamcity setprop start/working_directory = astring: :default
# svccfg -s teamcity setprop start/resource_pool = astring: :default
# svccfg -s teamcity setprop start/supp_groups = astring: :default
# svccfg -s teamcity setprop start/privileges = astring: :default
# svccfg -s teamcity setprop start/limit_privileges = astring: :default
# svccfg -s teamcity setprop start/use_profile = boolean: false
# svccfg -s teamcity setprop start/project = astring: java
# svcadm refresh teamcity

Обязательно прописываем эти свойства, а не только star/user, start/group, start/project. Иначе запуск будет от root’a. Запускаем и проверяем:

# svcadm enable teamcity
root@mirrow:/opt/teamcity# svcs teamcity
STATE          STIME    FMRI
online         12:29:24 svc:/application/teamcity:default
# ps -o pid,project,args -ef | grep "java" | grep -v grep
456060     java /usr/jdk/instances/jdk1.8.0/jre/bin/java -ea -Xmx384m -Dteamcity_logs=../logs/ 
456046     java /usr/bin/../bin/java -ea -cp ../launcher/lib/launcher.jar jetbrains.buildServer
456029     java /usr/bin/java -Djava.util.logging.config.file=/opt/teamcity/conf/logging.proper

3) Возможные ошибки.

[ Sep 23 12:26:44 svc.startd could not set context for method: ]
setproject: No such process

Означает, что юзер не пренадлежит указанному в свойствах сервиса проекту.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *