118

What is the difference between hard and soft limits in ulimit?

For number of open files, I have a soft limit of 1024 and a hard limit of 10240. It is possible to run programs opening more than 1024 files. What is the soft limit for?

daniel kullmann
  • 9,427
  • 11
  • 38
  • 45

2 Answers2

106

A hard limit can only be raised by root (any process can lower it). So it is useful for security: a non-root process cannot overstep a hard limit. But it's inconvenient in that a non-root process can't have a lower limit than its children.

A soft limit can be changed by the process at any time. So it's convenient as long as processes cooperate, but no good for security.

A typical use case for soft limits is to disable core dumps (ulimit -Sc 0) while keeping the option of enabling them for a specific process you're debugging ((ulimit -Sc unlimited; myprocess)).

The ulimit shell command is a wrapper around the setrlimit system call, so that's where you'll find the definitive documentation.

Note that some systems may not implement all limits. Specifically, some systems don't support per-process limits on file descriptors (Linux does); if yours doesn't, the shell command may be a no-op.

Gilles 'SO- stop being evil'
  • 807,993
  • 194
  • 1,674
  • 2,175
  • 7
    +1 for the soft limits use case. Resident set size limit (`ulimit -m`, `RLIMIT_RSS`) is an example of a limit that isn't effective on Linux anymore. Virtual memory limit (`ulimit -v`, `RLIMIT_AS`) works, though. – Adam Zalcman Jan 20 '12 at 17:53
  • 1
    @Gilles, do you mean without restarting the process, when we change the soft limit, it can be effect immediately? – Ryan Jun 29 '13 at 02:52
  • 1
    @Ryan Yes, a program can change its own soft limit at any time by calling `setrlimit` (to the extent permitted by the hard limit unless running as root of course). Most programs don't have a command that lets the user do that, but you can try attaching to the program with a debugger and making it issue a `setrlimit` call, or under Linux you can call [`prlimit`](http://linux.die.net/man/2/prlimit) (for which I don't know of any shell utility). – Gilles 'SO- stop being evil' Jun 29 '13 at 08:27
  • 2
    There is now a `prlimit` shell utility too. – telcoM Mar 26 '19 at 09:16
3

The hard limit is for the security purpose. For a non-root user, he can only decrease the hard limit from the currently set hard limit; he cannot increase it. Increasing the hard limit can be done only by root user (or maybe with sudo privilege, not sure about that). What a non-root user can do is choose a limit (called soft limit) which can be in the range [0, hard limit] for its processes. Its the soft limit which is seen and taken in consideration by the processes.

Ankit Shubham
  • 171
  • 1
  • 5