Làm thế nào để thiết lập ulimits trên dịch vụ với systemd?


29

Làm thế nào bạn sẽ thiết lập một ulimit trên một đơn vị dịch vụ systemd?

Câu hỏi stackoverflow này giải thích rằng systemd bỏ qua các lỗi hệ thống

Cú pháp trông như thế nào để thiết lập các lỗ hổng sau đây?

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
Tìm kiếm "Giới hạn" trong man 5 systemd.exec.
Toto

Câu trả lời:


58

Các ánh xạ của giới hạn systemd đến 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

Nếu một ulimit được đặt thành 'không giới hạn', hãy đặt nó thành 'vô cực' trong cấu hình systemd

ulimit -c unlimitedgiống như LimitCORE=infinity
ulimit -v unlimitedlà giống như LimitAS=infinity
ulimit -m unlimitedLimitRSS=infinity

Vì vậy, một cấu hình cuối cùng sẽ trông như thế nào

[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

Trong trường hợp cụ thể này, tôi không biết đường dẫn java đầy đủ (vì nó thay đổi dựa trên loại máy chủ) và systemd không hài lòng về các đường dẫn tương đối, tôi gói lệnh java trong một tập lệnh bash đơn giản nằm ở /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

Tôi sẽ không gọi đó là "trận chung kết". Nó vẫn cần tất cả các cài đặt lộn xộn như RUNASSOLR_ENVđược sửa hoặc xóa. Và sau đó, tất cả các trò chơi khăm trong bin/solrkịch bản shell hoàn toàn không cần thiết dưới một trình quản lý dịch vụ.
JdeBP

Cảm ơn đã chỉ ra rằng. Tôi đã cập nhật câu trả lời bằng một giải pháp sạch hơn, đặt tất cả các biến vào 1 vị trí và không sử dụng bin/solrtập lệnh cồng kềnh .
kẻ phá hoại

Xem unix.stackexchange.com/a/320319/5132 để biết thêm thông tin có thể sửa, bắt đầu bằng cách sử dụng exectrong tập lệnh shell.
JdeBP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.