# User Shells Almost every linux shell has ways to modify the user experience. There are multiple ways of changing your shell environment. Here are some topics listed: - modifying the shell user limits - virtual terminals ## Limits It is possible to address resource limits in a user shell, which make sure that programs do not run out of control. This can be useful for a code that might have an infinite recursion. This is usually controlled by the stack size limit. Check what resource limits you have: ```sh $ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 3091355 max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 10000 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited # in an slurm job it might be necessary to use ulimit -s unlimited # to allow a larger stack size for e.g. FORTRAN programs. ``` Stack contains all local variables & data, intermediate storage for registers, and function parameters. This setting is used to block infinite recursion. | flags | description | | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | -H | Specifies that the hard limit for the given resource is set. If you have root user authority, you can increase the hard limit. Anyone can decrease it | | -S | Specifies that the soft limit for the given resource is set. A soft limit can be increased up to the value of the hard limit. If neither the -H nor -S flags are specified, the limit applies to both | | -a | Lists all of the current resource limits | | -b | The maximum socket buffer size | | -c | The maximum size of core files created | | -d | The maximum size of a process's data segment | | -e | The maximum scheduling priority ("nice") | | -f | The maximum size of files written by the shell and its children | | -i | The maximum number of pending signals | | -l | The maximum size that may be locked into memory | | -m | The maximum resident set size (many systems do not honor this limit) | | -n | The maximum number of open file descriptors (most systems do not allow this value to be set) | | -p | The pipe size in 512-byte blocks (this may not be set) | | -q | The maximum number of bytes in POSIX message queues | | -r | The maximum real-time scheduling priority | | -s | The maximum stack size | | -t | The maximum amount of cpu time in seconds | | -u | The maximum number of processes available to a single user | | -v | The maximum amount of virtual memory available to the shell and, on some systems, to its children | | -x | The maximum number of file locks | | -T | The maximum number of threads |