systemd 서비스에서 ulimits를 설정하는 방법은 무엇입니까?


29

시스템 서비스 단위에 ulimit를 어떻게 설정 하시겠습니까?

stackoverflow 질문은 systemd가 시스템 ulimits를 무시한다는 것을 설명합니다.

다음 ulimits를 설정하는 구문은 무엇입니까?

ulimit -c
ulimit -v
ulimit -m

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
SOLR_INSTALL_DIR=/opt/solr
SOLR_ENV=/etc/default/solr.in.sh
RUNAS=solr

SOLR_PID_DIR="/var/solr"
SOLR_HOME="/opt/solr/server/solr"
LOG4J_PROPS="/var/solr/log4j.properties"
SOLR_LOGS_DIR="/opt/solr/server/logs"
SOLR_PORT="8389"

PIDFile=/var/solr/solr-8389.pid
ExecStart=/opt/solr/bin/solr start
ExecStatus=/opt/solr/bin/solr status
ExecStop=/opt/solr/bin/solr stop
Restart=on-failure
User=solr

SuccessExitStatus=143 0

[Install]
WantedBy=multi-user.target

1
에서 "제한"을 검색하십시오 man 5 systemd.exec.
Totor

답변:


58

시스템 제한을 ulimit에 매핑

Directive        ulimit equivalent     Unit
LimitCPU=        ulimit -t             Seconds      
LimitFSIZE=      ulimit -f             Bytes
LimitDATA=       ulimit -d             Bytes
LimitSTACK=      ulimit -s             Bytes
LimitCORE=       ulimit -c             Bytes
LimitRSS=        ulimit -m             Bytes
LimitNOFILE=     ulimit -n             Number of File Descriptors 
LimitAS=         ulimit -v             Bytes
LimitNPROC=      ulimit -u             Number of Processes 
LimitMEMLOCK=    ulimit -l             Bytes
LimitLOCKS=      ulimit -x             Number of Locks 
LimitSIGPENDING= ulimit -i             Number of Queued Signals 
LimitMSGQUEUE=   ulimit -q             Bytes
LimitNICE=       ulimit -e             Nice Level 
LimitRTPRIO=     ulimit -r             Realtime Priority  
LimitRTTIME=     No equivalent

ulimit가 '무제한'으로 설정된 경우 systemd 구성에서 '무한대'로 설정하십시오.

ulimit -c unlimited것과 동일 LimitCORE=infinity
ulimit -v unlimited과 동일 LimitAS=infinity
ulimit -m unlimited와 동일LimitRSS=infinity

따라서 최종 구성은 다음과 같습니다

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
WorkingDirectory=/opt/solr/server
User=solr
Group=solr
LimitAS=infinity
LimitRSS=infinity
LimitCORE=infinity
LimitNOFILE=65536
ExecStart=/opt/solr/bin/solr-foo
Restart=on-failure
SuccessExitStatus=143 0
SyslogIdentifier=solr


[Install]
WantedBy=multi-user.target

이 특별한 경우에는 전체 Java 경로를 알 수 없으며 (서버 유형에 따라 변경되기 때문에) systemd는 상대 경로에 만족하지 않습니다 .java 명령을에있는 간단한 bash 스크립트로 래핑하십시오. /opt/solr/bin/solr-foo

#!/bin/bash

. /opt/solr/bin/solr.in.sh

# Load $JAVA_HOME from 1 of 2 places where it could be defined
# Last one wins
if [[ -f "/etc/profile.d/jdk.sh" ]]; then
  . /etc/profile.d/jdk.sh
fi

if [[ -f "/etc/profile.d/zing.sh" ]]; then
  . /etc/profile.d/zing.sh
fi

exec ${JAVA_HOME}/bin/java -server \
  -Djetty.port=${SOLR_PORT} \
  ${SOLR_JAVA_MEM} \
  ${GC_TUNE} \
  ${GC_LOG_OPTS} \
  -DzkClientTimeout=${ZK_CLIENT_TIMEOUT} \
  -DzkHost=${ZK_HOST} \
  -DSTOP.PORT=7900 \
  -DSTOP.KEY=foobar \
  -Dhost=${SOLR_HOST} \
  -Duser.timezone=${SOLR_TIMEZONE} \
  -Djetty.home=/opt/solr/server \
  -Dsolr.solr.home=${SOLR_HOME} \
  -Dsolr.install.dir=/opt/solr \
  -Dlog4j.configuration=file:/var/solr/log4j.properties \
  -Xss256k \
  -Dbootstrap_conf=true \
  -Dbootstrap_confdir=/opt/solr/server/solr/configsets/foobar/conf \
  -Dcollection.configName=foobar \
  -jar start.jar --module=http

나는 "최종"이라고 부르지 않을 것입니다. 그것은 여전히 같은 그 엉망 접속 설정의 모든 필요 RUNASSOLR_ENV수정되거나 삭제 중입니다. 그리고 bin/solr셸 스크립트에는 서비스 관리자가 전혀 필요하지 않은 모든 후 팔라가 있습니다.
JdeBP

지적 해 주셔서 감사합니다. 모든 변수를 한 위치에 배치하고 bloated bin/solr스크립트를 사용하지 않는 더 깨끗한 솔루션으로 답변을 업데이트했습니다 .
spuder

쉘 스크립트에서 사용하여 시작하여 고칠 수있는 더 많은 내용은 unix.stackexchange.com/a/320319/5132 를 참조하십시오 exec.
JdeBP
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.