Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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?

share|improve this question
1  
Are you talking about ulimit -n? Try running a shell with a very low value (bash -c 'ulimit -n 4; exec 3>a; exec 4>b; exec 5>c'). What's the output? –  Gilles Jan 20 '12 at 17:23
add comment

1 Answer

up vote 14 down vote accepted

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.

share|improve this answer
2  
+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
    
@Gilles, do you mean without restarting the process, when we change the soft limit, it can be effect immediately? –  Ryan Jun 29 '13 at 2:52
    
@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 (for which I don't know of any shell utility). –  Gilles Jun 29 '13 at 8:27
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.