Existem duas maneiras de fazer isso:
- usando o utilitário
ulimit
shell ou usando a chamada do sistemasetrlimit
(que é o queulimit
chama por sua vez). - usando cotas do sistema de arquivos e um usuário especial para o processo do servidor restringirá o uso do total desse usuário
ulimit
/ setrlimit
Em man 2 setrlimit
:
RLIMIT_FSIZE
The maximum size of files that the process may create. Attempts
to extend a file beyond this limit result in delivery of a
SIGXFSZ signal. By default, this signal terminates a process,
but a process can catch this signal instead, in which case the
relevant system call (e.g., write(2), truncate(2)) fails with
the error EFBIG.
Não sei como é possível invocar a função setrlimit
do Java, mas A pergunta do U & L pode ajudar. Como alternativa, envolva o servidor Java em um script:
#! /bin/bash
ulimit -f 1073741824 # 1GB
java ....
Cotas do sistema de arquivos:
Estou assumindo um sistema de arquivos ext4, não tenho certeza sobre os outros. Primeiro, precisamos ativar a quota no sistema de arquivos. Edite /etc/fstab
e adicione usrquota
às opções de montagem da partição apropriada. Se estamos fazendo isso para /
, por exemplo, a entrada final seria algo como:
UUID=... / ext4 errors=remount-ro,usrquota 0 1
Em seguida, ative-o após a reinicialização:
sudo quotaon /
Suponho que seu servidor seja executado como um usuário diferente (digamos, restricted_user
). Se não, crie um se não quiser que seus processos normais sejam afetados.
Então faça:
sudo edquota restricted_user
O que abrirá um editor.
Disk quotas for user restricted_user (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sdd1 1087940 943718 1048576 9956 0 0
Defina os limites flexíveis e rígidos para os valores apropriados (eles são blocos de 1024 bytes, portanto, divida seu limite por 1024). Salve e saia.
Em seguida, o usuário não poderá exceder um total de uso de 1G nesse sistema de arquivos, contando todos os arquivos pertencentes a eles.
Naturalmente, você ainda deve verificar o tamanho no seu programa de servidor.