Wie setze ich ulimits auf Service mit systemd?

29

Wie würden Sie ein ulimit für eine systemd-Serviceeinheit festlegen?

Diese Stackoverflow-Frage erklärt, dass systemd System-Ulimits ignoriert

Wie würde die Syntax aussehen, um die folgenden Ulimits zu setzen?

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
Spuder
quelle
1
Suche nach "Limit" in man 5 systemd.exec.
Totor

Antworten:

58

Die Zuordnungen von systemd beschränken sich auf 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

Wenn ein ulimit auf "unbegrenzt" gesetzt ist, setzen Sie es in der systemd-Konfiguration auf "unendlich"

ulimit -c unlimitedist dasselbe wie LimitCORE=infinity
ulimit -v unlimitedist dasselbe wie LimitAS=infinity
ulimit -m unlimitedist dasselbe wieLimitRSS=infinity

So würde eine endgültige Konfiguration aussehen

[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

In diesem speziellen Fall kenne ich den vollständigen Java-Pfad nicht (da er sich je nach Servertyp ändert), und systemd freut sich nicht über relative Pfade. Ich verpacke den Java-Befehl in ein einfaches Bash-Skript unter /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
Spuder
quelle
Ich würde das nicht "final" nennen. Es muss noch alle diese verkorksten Einstellungen wie RUNASund SOLR_ENVentweder korrigiert oder entfernt werden . Und dann ist da noch der ganze Mist im bin/solrShell-Skript, der unter einem Servicemanager völlig unnötig ist.
JdeBP
Vielen Dank für den Hinweis. Ich habe die Antwort mit einer saubereren Lösung aktualisiert, bei der alle Variablen an einem Ort abgelegt werden und das aufgeblähte bin/solrSkript nicht verwendet wird .
Spuder
Unter unix.stackexchange.com/a/320319/5132 finden Sie weitere Informationen , die behoben werden können, beginnend mit der Verwendung execim Shell-Skript.
JdeBP