Нужно создать и запустить сервис (на примере 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
Означает, что юзер не пренадлежит указанному в свойствах сервиса проекту.