Differenza tra ulimit -n e / proc / $ PID / limits


9

In Linux, esiste un limite di file aperto. Posso usare ulimit -nper vedere il limite di file aperto, che è il valore predefinito 1024. Quindi posso anche vedere per processo aprire il file soft / hard limit guardando / proc / $ PID / limits. Vedo soft = 1024 e hard = 4096.

Mi chiedo qual è la differenza tra questi due output?

Inoltre, si applicano setRlimit()e si getRlimit()applicano a tutto il sistema o per processo?

Risposte:


11

ulimit -nimposta il limite morbido per impostazione predefinita; è possibile aggiungere l' -Hopzione per visualizzare / impostare il limite rigido.

Per la maggior parte, i limiti soft e hard si comportano così:

  1. I processi di root (in realtà, qualsiasi processo con CAP_SYS_RESOURCE) possono alzare o abbassare qualsiasi limite su qualsiasi processo.
  2. i processi di qualsiasi utente possono ridurre qualsiasi limite su altri processi di proprietà di tale utente.
  3. i processi di qualsiasi utente possono elevare il limite flessibile fino al limite rigido per i processi di proprietà di tale utente.
  4. Se un processo tenta di superare il limite flessibile, il tentativo fallirà.

Quindi, i limiti rigidi funzionano come un limite ai limiti morbidi (ad eccezione di root, che normalmente può fare qualsiasi cosa).

C'è un'eccezione: un limite di CPU soft invia un SIGXCPUsegnale. Un processo può scegliere di ignorarlo o di dedicare del tempo alla pulizia, ecc. Una volta superato il limite della CPU rigida, il kernel invia, SIGKILLche non è comprensibile, gestibile o ignorabile. Quindi, in questo caso, il limite software funziona come un avvertimento "hai esaurito il tempo della CPU: finisci e chiudi prontamente, altrimenti!" e il limite rigido è "oppure".

La maggior parte sono per processo, ma alcuni (come RLIMIT_NPROC) sono per utente. La pagina di manuale getrlimit (2) specifica per ciascun limite.


Un'altra domanda correlata, perché a volte la mia shell ha ulimit -n = 1024 e un altro processo generato da questa shell ha un limite morbido = 4096 (lettura da / proc / PID / limits)
sdeLevelNegativeDue

@sdeLevelNegativeTwo Hai interrotto il processo prima o dopo il ulimit -n? Non influisce sui processi già avviati, solo sulla shell e su quelli futuri. Oltre a ciò, il processo potrebbe aumentare il limite soft al limite hard. Quindi potresti usarlo ulimit -H -nper fermarlo.
derobert l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.