Provided by: erlang-base_16.b.3-dfsg-1ubuntu2.2_amd64 bug

NAME

       erl - The Erlang Emulator

DESCRIPTION

       The  erl  program starts an Erlang runtime system. The exact details (for example, whether
       erl is a script or a program and which other programs it calls) are system-dependent.

       Windows users probably wants to use the werl program instead, which runs in its own window
       with  scrollbars and supports command-line editing. The erl program on Windows provides no
       line editing in its shell, and on Windows 95 there is no way to scroll back to text  which
       has scrolled off the screen. The erl program must be used, however, in pipelines or if you
       want to redirect standard input or output.

   Note:
       As of ERTS version 5.9 (OTP-R15B) the runtime system will by default not  bind  schedulers
       to logical processors. For more information see documentation of the +sbt system flag.

EXPORTS

       erl <arguments>

              Starts an Erlang runtime system.

              The arguments can be divided into emulator flags, flags and plain arguments:

                * Any argument starting with the character + is interpreted as an emulator flag.

                  As indicated by the name, emulator flags controls the behavior of the emulator.

                * Any  argument  starting  with the character - (hyphen) is interpreted as a flag
                  which should be  passed  to  the  Erlang  part  of  the  runtime  system,  more
                  specifically to the init system process, see init(3erl).

                  The init process itself interprets some of these flags, the init flags. It also
                  stores any remaining flags, the user flags. The  latter  can  be  retrieved  by
                  calling init:get_argument/1.

                  It  can  be noted that there are a small number of "-" flags which now actually
                  are emulator flags, see the description below.

                * Plain arguments are not interpreted in any way. They are  also  stored  by  the
                  init  process and can be retrieved by calling init:get_plain_arguments/0. Plain
                  arguments can occur before the first flag, or after a  --  flag.  Additionally,
                  the flag -extra causes everything that follows to become plain arguments.

              Example:

              % erl +W w -sname arnie +R 9 -s my_init -extra +bertie
              (arnie@host)1> init:get_argument(sname).
              {ok,[["arnie"]]}
              (arnie@host)2> init:get_plain_arguments().
              ["+bertie"]

              Here  +W  w and +R 9 are emulator flags. -s my_init is an init flag, interpreted by
              init. -sname arnie is a user flag, stored by init. It is read by  Kernel  and  will
              cause  the  Erlang  runtime system to become distributed. Finally, everything after
              -extra (that is, +bertie) is considered as plain arguments.

              % erl -myflag 1
              1> init:get_argument(myflag).
              {ok,[["1"]]}
              2> init:get_plain_arguments().
              []

              Here the user flag -myflag 1 is passed to and stored by the init process. It  is  a
              user defined flag, presumably used by some user defined application.

FLAGS

       In  the following list, init flags are marked (init flag). Unless otherwise specified, all
       other  flags  are  user  flags,  for  which  the  values  can  be  retrieved  by   calling
       init:get_argument/1.  Note  that  the  list  of user flags is not exhaustive, there may be
       additional, application specific flags which instead are documented in  the  corresponding
       application documentation.

         --(init flag):
           Everything  following  --  up  to  the  next flag (-flag or +flag) is considered plain
           arguments and can be retrieved using init:get_plain_arguments/0.

         -Application Par Val:
           Sets the application configuration parameter Par to the value Val for the  application
           Application, see app(5) and application(3erl).

         -args_file FileName:
           Command  line  arguments  are read from the file FileName. The arguments read from the
           file replace the '-args_file FileName' flag on the resulting command line.

           The file FileName should be a plain text file and may  contain  comments  and  command
           line  arguments.  A  comment begins with a # character and continues until next end of
           line character. Backslash  (\\)  is  used  as  quoting  character.  All  command  line
           arguments  accepted  by erl are allowed, also the -args_file FileName flag. Be careful
           not to cause circular dependencies  between  files  containing  the  -args_file  flag,
           though.

           The -extra flag is treated specially. Its scope ends at the end of the file. Arguments
           following an -extra flag are moved on the command line into the -extra  section,  i.e.
           the end of the command line following after an -extra flag.

         -async_shell_start:
           The  initial Erlang shell does not read user input until the system boot procedure has
           been completed (Erlang 5.4 and later). This flag disables  the  start  synchronization
           feature and lets the shell start in parallel with the rest of the system.

         -boot File:
           Specifies the name of the boot file, File.boot, which is used to start the system. See
           init(3erl). Unless File contains an absolute path, the system searches  for  File.boot
           in the current and $ROOT/bin directories.

           Defaults to $ROOT/bin/start.boot.

         -boot_var Var Dir:
           If  the  boot  script  contains a path variable Var other than $ROOT, this variable is
           expanded to Dir. Used when  applications  are  installed  in  another  directory  than
           $ROOT/lib, see systools:make_script/1,2.

         -code_path_cache:
           Enables the code path cache of the code server, see code(3erl).

         -compile Mod1 Mod2 ...:
           Compiles  the  specified  modules  and then terminates (with non-zero exit code if the
           compilation of some file did not succeed). Implies -noinput.  Not  recommended  -  use
           erlc instead.

         -config Config:
           Specifies  the name of a configuration file, Config.config, which is used to configure
           applications. See app(5) and application(3erl).

         -connect_all false:
           If this flag is present, global  will  not  maintain  a  fully  connected  network  of
           distributed  Erlang  nodes,  and  then  global  name  registration cannot be used. See
           global(3erl).

         -cookie Cookie:
           Obsolete flag without any effect and common misspelling for -setcookie. Use -setcookie
           instead.

         -detached:
           Starts  the Erlang runtime system detached from the system console. Useful for running
           daemons and backgrounds processes. Implies -noinput.

         -emu_args:
           Useful for debugging. Prints out the actual arguments sent to the emulator.

         -env Variable Value:
           Sets the host OS environment variable Variable to  the  value  Value  for  the  Erlang
           runtime system. Example:

         % erl -env DISPLAY gin:0

           In  this  example,  an  Erlang  runtime system is started with the DISPLAY environment
           variable set to gin:0.

         -eval Expr(init flag):
           Makes init evaluate the expression Expr, see init(3erl).

         -extra(init flag):
           Everything following -extra is considered plain arguments and can be  retrieved  using
           init:get_plain_arguments/0.

         -heart:
           Starts heart beat monitoring of the Erlang runtime system. See heart(3erl).

         -hidden:
           Starts the Erlang runtime system as a hidden node, if it is run as a distributed node.
           Hidden nodes always establish hidden connections to all other nodes except  for  nodes
           in  the  same  global  group.  Hidden  connections  are not published on either of the
           connected nodes, i.e. neither of the connected nodes  are  part  of  the  result  from
           nodes/0 on the other node. See also hidden global groups, global_group(3erl).

         -hosts Hosts:
           Specifies the IP addresses for the hosts on which Erlang boot servers are running, see
           erl_boot_server(3erl). This flag is mandatory if the -loader inet flag is present.

           The IP addresses must be given in the standard form (four decimal numbers separated by
           periods,  for example "150.236.20.74". Hosts names are not acceptable, but a broadcast
           address (preferably limited to the local network) is.

         -id Id:
           Specifies the identity of the Erlang runtime system. If it is  run  as  a  distributed
           node,  Id  must  be  identical  to the name supplied together with the -sname or -name
           flag.

         -init_debug:
           Makes init write some debug information while interpreting the boot script.

         -instr(emulator flag):
           Selects an instrumented Erlang runtime system (virtual machine) to run, instead of the
           ordinary  one.  When  running an instrumented runtime system, some resource usage data
           can be obtained and analysed using the module  instrument.  Functionally,  it  behaves
           exactly like an ordinary Erlang runtime system.

         -loader Loader:
           Specifies  the  method used by erl_prim_loader to load Erlang modules into the system.
           See erl_prim_loader(3erl). Two Loader methods are supported,  efile  and  inet.  efile
           means  use the local file system, this is the default. inet means use a boot server on
           another machine, and the -id, -hosts and -setcookie flags must be specified  as  well.
           If Loader is something else, the user supplied Loader port program is started.

         -make:
           Makes the Erlang runtime system invoke make:all() in the current working directory and
           then terminate. See make(3erl). Implies -noinput.

         -man Module:
           Displays the manual page for the Erlang module Module. Only supported on Unix.

         -mode interactive | embedded:
           Indicates if the system should load code dynamically (interactive),  or  if  all  code
           should  be loaded during system initialization (embedded), see code(3erl). Defaults to
           interactive.

         -name Name:
           Makes the Erlang runtime system into a distributed node. This flag invokes all network
           servers  necessary  for a node to become distributed. See net_kernel(3erl). It is also
           ensured that epmd runs on the current host before Erlang is started. See epmd(1).

           The name of the node will be Name@Host, where Host is the fully qualified host name of
           the current host. For short names, use the -sname flag instead.

         -noinput:
           Ensures  that  the  Erlang  runtime  system  never  tries  to  read any input. Implies
           -noshell.

         -noshell:
           Starts an Erlang runtime system with no shell. This flag makes it possible to have the
           Erlang runtime system as a component in a series of UNIX pipes.

         -nostick:
           Disables the sticky directory facility of the Erlang code server, see code(3erl).

         -oldshell:
           Invokes the old Erlang shell from Erlang 3.3. The old shell can still be used.

         -pa Dir1 Dir2 ...:
           Adds  the  specified  directories  to  the  beginning  of  the  code  path, similar to
           code:add_pathsa/1. See code(3erl). As an alternative to -pa,  if  several  directories
           are  to  be  prepended to the code and the directories have a common parent directory,
           that parent directory could be specified in the  ERL_LIBS  environment  variable.  See
           code(3erl).

         -pz Dir1 Dir2 ...:
           Adds   the   specified   directories   to  the  end  of  the  code  path,  similar  to
           code:add_pathsz/1. See code(3erl).

         -remsh Node:
           Starts Erlang with a remote shell connected to Node.

         -rsh Program:
           Specifies an alternative to rsh for starting a  slave  node  on  a  remote  host.  See
           slave(3erl).

         -run Mod [Func [Arg1, Arg2, ...]](init flag):
           Makes  init  call  the specified function. Func defaults to start. If no arguments are
           provided, the function is assumed to be of arity 0. Otherwise it is assumed to  be  of
           arity  1,  taking  the  list  [Arg1,Arg2,...] as argument. All arguments are passed as
           strings. See init(3erl).

         -s Mod [Func [Arg1, Arg2, ...]](init flag):
           Makes init call the specified function. Func defaults to start. If  no  arguments  are
           provided,  the  function is assumed to be of arity 0. Otherwise it is assumed to be of
           arity 1, taking the list [Arg1,Arg2,...] as argument.  All  arguments  are  passed  as
           atoms. See init(3erl).

         -setcookie Cookie:
           Sets the magic cookie of the node to Cookie, see erlang:set_cookie/2.

         -shutdown_time Time:
           Specifies  how  long  time  (in  milliseconds)  the  init  process is allowed to spend
           shutting down the system. If Time ms have elapsed, all processes  still  existing  are
           killed. Defaults to infinity.

         -sname Name:
           Makes  the  Erlang  runtime  system into a distributed node, similar to -name, but the
           host name portion of the node name  Name@Host  will  be  the  short  name,  not  fully
           qualified.

           This  is  sometimes  the  only  way  to run distributed Erlang if the DNS (Domain Name
           System) is not running. There can be no communication between nodes running  with  the
           -sname  flag  and  those  running with the -name flag, as node names must be unique in
           distributed Erlang systems.

         -smp [enable|auto|disable]:
           -smp enable and -smp starts the Erlang runtime system with SMP support  enabled.  This
           may  fail  if  no  runtime  system with SMP support is available. -smp auto starts the
           Erlang runtime system with SMP support enabled if it is available and  more  than  one
           logical  processor  are  detected.  -smp  disable  starts a runtime system without SMP
           support.

           NOTE: The runtime system with SMP support will  not  be  available  on  all  supported
           platforms. See also the +S flag.

         -version(emulator flag):
           Makes the emulator print out its version number. The same as erl +V.

EMULATOR FLAGS

       erl  invokes  the  code  for  the  Erlang  emulator  (virtual machine), which supports the
       following flags:

         +a size:
           Suggested stack size, in kilowords, for threads in the async-thread pool. Valid  range
           is  16-8192  kilowords.  The  default  suggested  stack  size is 16 kilowords, i.e, 64
           kilobyte on 32-bit architectures. This small default size has been  chosen  since  the
           amount  of  async-threads might be quite large. The default size is enough for drivers
           delivered with Erlang/OTP, but might not be sufficiently large for  other  dynamically
           linked  in  drivers  that  use  the  driver_async() functionality. Note that the value
           passed is only a suggestion, and it might even be ignored on some platforms.

         +A size:
           Sets the number of threads in async thread pool, valid  range  is  0-1024.  If  thread
           support is available, the default is 10.

         +B [c | d | i]:
           The c option makes Ctrl-C interrupt the current shell instead of invoking the emulator
           break handler. The d option (same as specifying +B without an extra  option)  disables
           the break handler. The i option makes the emulator ignore any break signal.

           If  the  c option is used with oldshell on Unix, Ctrl-C will restart the shell process
           rather than interrupt it.

           Note that on Windows, this flag is only applicable for werl, not erl (oldshell).  Note
           also that Ctrl-Break is used instead of Ctrl-C on Windows.

         +c:
           Disable compensation for sudden changes of system time.

           Normally, erlang:now/0 will not immediately reflect sudden changes in the system time,
           in  order  to  keep  timers  (including  receive-after)  working.  Instead,  the  time
           maintained  by  erlang:now/0  is  slowly adjusted towards the new system time. (Slowly
           means in one percent adjustments; if the time is off by one minute, the time  will  be
           adjusted in 100 minutes.)

           When  the  +c  option  is  given,  this  slow  adjustment will not take place. Instead
           erlang:now/0 will always reflect the current system time. Note that timers  are  based
           on erlang:now/0. If the system time jumps, timers then time out at the wrong time.

         +d:
           If  the emulator detects an internal error (or runs out of memory), it will by default
           generate both a crash dump and a core dump. The core dump will, however, not  be  very
           useful since the content of process heaps is destroyed by the crash dump generation.

           The  +d option instructs the emulator to only produce a core dump and no crash dump if
           an internal error is detected.

           Calling erlang:halt/1 with a string argument will still produce a crash dump.

         +e Number:
           Set max number of ETS tables.

         +ec:
           Force the compressed option on all ETS tables. Only intended for test and evaluation.

         +fnl:
           The VM works with file names as if they are encoded using  the  ISO-latin-1  encoding,
           disallowing  Unicode  characters  with  codepoints  beyond  255.  This  is  default on
           operating systems that have transparent file naming, i.e. all Unixes except MacOSX.

           See STDLIB User's Guide for more infomation about unicode file names.

         +fnu[{w|i|e}]:
           The VM works with file names as if they are encoded using UTF-8 (or some other  system
           specific  Unicode  encoding).  This  is  the default on operating systems that enforce
           Unicode encoding, i.e. Windows and MacOSX.

           The +fnu switch can be followed by w, i, or e to control the way wrongly encoded  file
           names  are to be reported. w means that a warning is sent to the error_logger whenever
           a wrongly encoded file name is "skipped" in directory listings,  i  means  that  those
           wrongly encoded file names are silently ignored and e means that the API function will
           return an error whenever a wrongly encoded file (or directory) name is encountered.  w
           is  the  default.  Note  that file:read_link/1 will always return an error if the link
           points to an invalid file name.

           See STDLIB User's Guide for more infomation about unicode file names.

         +fna[{w|i|e}]:
           Selection between +fnl and +fnu is done based on the current locale  settings  in  the
           OS,  meaning  that if you have set your terminal for UTF-8 encoding, the filesystem is
           expected to use the same encoding for file names (use with care).

           The +fna switch can be followed by w, i, or e. This will have  effect  if  the  locale
           settings cause the behavior of +fnu to be selected. See the description of +fnu above.
           If the locale settings cause the behavior of +fnl to be selected, then w, i, or e will
           not have any effect.

           See STDLIB User's Guide for more infomation about unicode file names.

         +hms Size:
           Sets the default heap size of processes to the size Size.

         +hmbs Size:
           Sets the default binary virtual heap size of processes to the size Size.

         +K true | false:
           Enables or disables the kernel poll functionality if the emulator supports it. Default
           is false (disabled). If the emulator does not support kernel poll, and the +K flag  is
           passed to the emulator, a warning is issued at startup.

         +l:
           Enables auto load tracing, displaying info while loading code.

         +L:
           Don't  load  information about source file names and line numbers. This will save some
           memory, but exceptions will not contain information about  the  file  names  and  line
           numbers.

         +MFlag Value:
           Memory allocator specific flags, see erts_alloc(3erl) for further information.

         +n Behavior:
           Control behavior of signals to ports.

           As  of  OTP-R16 signals to ports are truly asynchronously delivered. Note that signals
           always have been  documented  as  asynchronous.  The  underlying  implementation  has,
           however,  previously  delivered  these signals synchronously. Correctly written Erlang
           programs should be able to handle this without any issues.  Bugs  in  existing  Erlang
           programs that make false assumptions about signals to ports may, however, be tricky to
           find. This switch has been introduced in order to at least make it easier  to  compare
           behaviors  during  a  transition  period.  Note that this flag is deprecated as of its
           introduction, and is scheduled for removal in OTP-R17. Behavior should be one  of  the
           following characters:

           d:
             The  default.  Asynchronous  signals.  A  process  that sends a signal to a port may
             continue execution before the signal has been delivered to the port.

           s:
             Synchronous signals. A processes that sends a signal to a  port  will  not  continue
             execution  until  the signal has been delivered. Should only be used for testing and
             debugging.

           a:
             Asynchronous signals. As the default, but a processes that sends a signal will  even
             more frequently continue execution before the signal has been delivered to the port.
             Should only be used for testing and debugging.

         +pc Range:
           Sets the range of characters that the system  will  consider  printable  in  heuristic
           detection  of  strings.  This  typically  affects  the  shell,  debugger and io:format
           functions (when ~tp is used in the format string).

           Currently two values for the Range are supported:

             latin1:
               The default. Only characters in the ISO-latin-1 range can be considered printable,
               which  means  that  a  character  with a code point > 255 will never be considered
               printable and that lists containing such characters will be displayed as lists  of
               integers rather than text strings by tools.

             unicode:
               All  printable  Unicode  characters  are  considered when determining if a list of
               integers is to be displayed in string syntax. This may give unexpected results  if
               for example your font does not cover all Unicode characters.

           Se also  io:printable_range/0.

         +P Number|legacy:
           Sets  the  maximum  number  of  simultaneously existing processes for this system if a
           Number is passed as value. Valid range for Number is [1024-134217727]

           NOTE: The actual maximum chosen may be much larger than the Number  passed.  Currently
           the  runtime  system often, but not always, chooses a value that is a power of 2. This
           might, however, be changed in the future. The actual value chosen can  be  checked  by
           calling erlang:system_info(process_limit).

           The default value is 262144

           If  legacy  is  passed  as  value,  the  legacy  algorithm  for  allocation of process
           identifiers will be used. Using the legacy algorithm, identifiers will be allocated in
           a strictly increasing fashion until largest possible identifier has been reached. Note
           that  this  algorithm  suffers  from  performance  issues  and   can   under   certain
           circumstances  be  extremely  expensive.  The  legacy  algoritm is deprecated, and the
           legacy option is scheduled for removal in OTP-R18.

         +Q Number|legacy:
           Sets the maximum number of simultaneously existing ports for this system if  a  Number
           is passed as value. Valid range for Number is [1024-134217727]

           NOTE:  The  actual  maximum  chosen  may be much larger than the actual Number passed.
           Currently the runtime system often, but not always, chooses a value that is a power of
           2.  This  might,  however,  be  changed  in the future. The actual value chosen can be
           checked by calling erlang:system_info(port_limit).

           The default value used is normally 65536. However, if the runtime system  is  able  to
           determine maximum amount of file descriptors that it is allowed to open and this value
           is larger than 65536, the chosen value will increased to a value larger  or  equal  to
           the maximum amount of file descriptors that can be opened.

           On  Windows the default value is set to 8196 because the normal OS limitations are set
           higher than most machines can handle.

           Previously the environment variable ERL_MAX_PORTS was used  for  setting  the  maximum
           number  of simultaneously existing ports. This environment variable is deprecated, and
           scheduled for removal in OTP-R17, but can still be used.

           If legacy is passed as value, the legacy algorithm for allocation of port  identifiers
           will  be used. Using the legacy algorithm, identifiers will be allocated in a strictly
           increasing fashion until largest possible identifier has been reached. Note that  this
           algorithm  suffers  from  performance  issues  and  can under certain circumstances be
           extremely expensive. The legacy algoritm is  deprecated,  and  the  legacy  option  is
           scheduled for removal in OTP-R18.

         +R ReleaseNumber:
           Sets the compatibility mode.

           The distribution mechanism is not backwards compatible by default. This flags sets the
           emulator in compatibility mode with an earlier Erlang/OTP release  ReleaseNumber.  The
           release  number  must  be  in  the  range <current release>-2..<current release>. This
           limits the emulator, making it possible for it to communicate with  Erlang  nodes  (as
           well as C- and Java nodes) running that earlier release.

           Note: Make sure all nodes (Erlang-, C-, and Java nodes) of a distributed Erlang system
           is of the same Erlang/OTP release, or from two different Erlang/OTP releases X and  Y,
           where all Y nodes have compatibility mode X.

         +r:
           Force ets memory block to be moved on realloc.

         +rg ReaderGroupsLimit:
           Limits  the  amount  of  reader  groups  used  by  read/write locks optimized for read
           operations in the Erlang runtime system. By default the reader groups limit equals 64.

           When the amount of schedulers is less than or equal to the reader groups  limit,  each
           scheduler  has  its own reader group. When the amount of schedulers is larger than the
           reader groups limit, schedulers share reader groups.  Shared  reader  groups  degrades
           read  lock  and read unlock performance while a large amount of reader groups degrades
           write lock performance, so the limit  is  a  tradeoff  between  performance  for  read
           operations  and performance for write operations. Each reader group currently consumes
           64 byte in each read/write lock. Also note that a runtime system using  shared  reader
           groups benefits from binding schedulers to logical processors, since the reader groups
           are distributed better between schedulers.

         +S Schedulers:SchedulerOnline:
           Sets the number of scheduler threads to create and scheduler  threads  to  set  online
           when  SMP support has been enabled. The maximum for both values is 1024. If the Erlang
           runtime system is able to determine the amount of logical  processors  configured  and
           logical   processors   available,   Schedulers  will  default  to  logical  processors
           configured,  and  SchedulersOnline  will  default  to  logical  processors  available;
           otherwise, the default values will be 1. Schedulers may be omitted if :SchedulerOnline
           is not and vice versa. The number of schedulers online can be changed at run time  via
           erlang:system_flag(schedulers_online, SchedulersOnline).

           If  Schedulers  or  SchedulersOnline  is  specified as a negative number, the value is
           subtracted from the  default  number  of  logical  processors  configured  or  logical
           processors available, respectively.

           Specifying  the  value  0  for  Schedulers  or  SchedulersOnline  resets the number of
           scheduler threads or scheduler threads online respectively to its default value.

           This option is ignored if the emulator doesn't have SMP support enabled (see the  -smp
           flag).

         +SP SchedulersPercentage:SchedulersOnlinePercentage:
           Similar  to  +S but uses percentages to set the number of scheduler threads to create,
           based on logical processors configured, and scheduler threads to set online, based  on
           logical processors available, when SMP support has been enabled. Specified values must
           be greater than 0. For example, +SP 50:25 sets the number of scheduler threads to  50%
           of the logical processors configured and the number of scheduler threads online to 25%
           of  the  logical  processors  available.  SchedulersPercentage  may  be   omitted   if
           :SchedulersOnlinePercentage is not and vice versa. The number of schedulers online can
           be changed at run time via erlang:system_flag(schedulers_online, SchedulersOnline).

           This option interacts with +S settings. For example, on a system with 8 logical  cores
           configured  and  8  logical cores available, the combination of the options +S 4:4 +SP
           50:25 (in either order) results in 2 scheduler threads (50%  of  4)  and  1  scheduler
           thread online (25% of 4).

           This  option is ignored if the emulator doesn't have SMP support enabled (see the -smp
           flag).

         +sFlag Value:
           Scheduling specific flags.

           +sbt BindType:
             Set scheduler bind type.

             Schedulers can also be bound using the +stbt flag. The only difference between these
             two flags is how the following errors are handled:

             * Binding of schedulers is not supported on the specific platform.

             * No   available  CPU  topology.  That  is  the  runtime  system  was  not  able  to
               automatically detected the CPU topology, and no user defined CPU topology was set.

             If any of these errors occur when +sbt has been  passed,  the  runtime  system  will
             print an error message, and refuse to start. If any of these errors occur when +stbt
             has been passed, the runtime system will silently ignore the  error,  and  start  up
             using unbound schedulers.

             Currently valid BindTypes:

             u:
               unbound  - Schedulers will not be bound to logical processors, i.e., the operating
               system decides where the scheduler threads execute, and when to migrate them. This
               is the default.

             ns:
               no_spread  - Schedulers with close scheduler identifiers will be bound as close as
               possible in hardware.

             ts:
               thread_spread - Thread refers to hardware threads  (e.g.  Intel's  hyper-threads).
               Schedulers  with  low  scheduler  identifiers, will be bound to the first hardware
               thread of each core, then schedulers with higher  scheduler  identifiers  will  be
               bound to the second hardware thread of each core, etc.

             ps:
               processor_spread  -  Schedulers  will  be spread like thread_spread, but also over
               physical processor chips.

             s:
               spread - Schedulers will be spread as much as possible.

             nnts:
               no_node_thread_spread - Like thread_spread,  but  if  multiple  NUMA  (Non-Uniform
               Memory  Access)  nodes  exists,  schedulers will be spread over one NUMA node at a
               time, i.e., all logical processors of one NUMA node will be bound to schedulers in
               sequence.

             nnps:
               no_node_processor_spread  -  Like  processor_spread,  but  if  multiple NUMA nodes
               exists, schedulers will be spread over one NUMA node at a time, i.e., all  logical
               processors of one NUMA node will be bound to schedulers in sequence.

             tnnps:
               thread_no_node_processor_spread    -   A   combination   of   thread_spread,   and
               no_node_processor_spread. Schedulers will be spread over hardware  threads  across
               NUMA  nodes,  but schedulers will only be spread over processors internally in one
               NUMA node at a time.

             db:
               default_bind -  Binds  schedulers  the  default  way.  Currently  the  default  is
               thread_no_node_processor_spread (which might change in the future).

             Binding  of schedulers is currently only supported on newer Linux, Solaris, FreeBSD,
             and Windows systems.

             If no CPU topology is available when the +sbt flag is processed and BindType is  any
             other  type  than  u,  the  runtime  system  will fail to start. CPU topology can be
             defined using the +sct flag. Note that the +sct flag may have to  be  passed  before
             the  +sbt  flag  on the command line (in case no CPU topology has been automatically
             detected).

             The runtime system will by default not bind schedulers to logical processors.

             NOTE: If the Erlang runtime system is the only operating system process  that  binds
             threads  to logical processors, this improves the performance of the runtime system.
             However, if other operating system processes (as for example another Erlang  runtime
             system)  also  bind  threads  to  logical  processors,  there might be a performance
             penalty instead. In some cases this performance penalty might be severe. If this  is
             the case, you are advised to not bind the schedulers.

             How  schedulers  are  bound matters. For example, in situations when there are fewer
             running processes than schedulers  online,  the  runtime  system  tries  to  migrate
             processes  to schedulers with low scheduler identifiers. The more the schedulers are
             spread over the hardware, the more resources will be available to the runtime system
             in such situations.

             NOTE:  If a scheduler fails to bind, this will often be silently ignored. This since
             it isn't always possible to verify valid logical processor identifiers. If an  error
             is reported, it will be reported to the error_logger. If you want to verify that the
             schedulers      actually       have       bound       as       requested,       call
             erlang:system_info(scheduler_bindings).

           +sbwt none|very_short|short|medium|long|very_long:
             Set  scheduler  busy wait threshold. Default is medium. The threshold determines how
             long schedulers should busy wait when running out of work before going to sleep.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +scl true|false:
             Enable or disable scheduler compaction of load. By default scheduler  compaction  of
             load  is  enabled.  When enabled, load balancing will strive for a load distribution
             which causes as many scheduler threads as possible to be fully loaded (i.e., not run
             out  of work). This is accomplished by migrating load (e.g. runnable processes) into
             a smaller set of schedulers  when  schedulers  frequently  run  out  of  work.  When
             disabled, the frequency with which schedulers run out of work will not be taken into
             account by the load balancing logic.

           +sct CpuTopology:

             * <Id> = integer(); when 0 =< <Id> =< 65535

             * <IdRange> = <Id>-<Id>

             * <IdOrIdRange> = <Id> | <IdRange>

             * <IdList> = <IdOrIdRange>,<IdOrIdRange> | <IdOrIdRange>

             * <LogicalIds> = L<IdList>

             * <ThreadIds> = T<IdList> | t<IdList>

             * <CoreIds> = C<IdList> | c<IdList>

             * <ProcessorIds> = P<IdList> | p<IdList>

             * <NodeIds> = N<IdList> | n<IdList>

             * <IdDefs>     =      <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>      |
               <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>

             * CpuTopology = <IdDefs>:<IdDefs> | <IdDefs>

             Set  a  user  defined  CPU topology. The user defined CPU topology will override any
             automatically  detected  CPU  topology.  The  CPU  topology  is  used  when  binding
             schedulers to logical processors.

             Upper-case  letters  signify  real  identifiers  and lower-case letters signify fake
             identifiers only used for description of the topology. Identifiers  passed  as  real
             identifiers  may  be  used  by  the  runtime  system  when trying to access specific
             hardware and if they are not correct the behavior is undefined.  Faked  logical  CPU
             identifiers  are  not  accepted since there is no point in defining the CPU topology
             without real logical CPU identifiers. Thread, core, processor, and node  identifiers
             may  be  left  out.  If  left out, thread id defaults to t0, core id defaults to c0,
             processor id defaults to p0, and node id will be left undefined. Either each logical
             processor  must  belong to one and only one NUMA node, or no logical processors must
             belong to any NUMA nodes.

             Both increasing and decreasing <IdRange>s are allowed.

             NUMA node identifiers are system wide. That is, each NUMA node on the system have to
             have  a  unique  identifier.  Processor  identifiers  are  also  system  wide.  Core
             identifiers are processor wide. Thread identifiers are core wide.

             The order of the identifier types imply the hierarchy of  the  CPU  topology.  Valid
             orders   are   either   <LogicalIds><ThreadIds><CoreIds><ProcessorIds><NodeIds>,  or
             <LogicalIds><ThreadIds><CoreIds><NodeIds><ProcessorIds>. That is, thread is part  of
             a  core which is part of a processor which is part of a NUMA node, or thread is part
             of a core which is part of a NUMA node which is part of a processor. A cpu  topology
             can consist of both processor external, and processor internal NUMA nodes as long as
             each logical processor belongs to one and only one NUMA node. If  <ProcessorIds>  is
             left  out,  its  default  position will be before <NodeIds>. That is, the default is
             processor external NUMA nodes.

             If a list of identifiers is used in an <IdDefs>:

             * <LogicalIds> have to be a list of identifiers.

             * At least one other identifier type apart from <LogicalIds> also  have  to  have  a
               list of identifiers.

             * All lists of identifiers have to produce the same amount of identifiers.

             A simple example. A single quad core processor may be described this way:

           % erl +sct L0-3c0-3
           1> erlang:system_info(cpu_topology).
           [{processor,[{core,{logical,0}},
                        {core,{logical,1}},
                        {core,{logical,2}},
                        {core,{logical,3}}]}]

             A  little  more complicated example. Two quad core processors. Each processor in its
             own NUMA node. The ordering of logical processors is a little weird. This  in  order
             to give a better example of identifier lists:

           % erl +sct L0-1,3-2c0-3p0N0:L7,4,6-5c0-3p1N1
           1> erlang:system_info(cpu_topology).
           [{node,[{processor,[{core,{logical,0}},
                               {core,{logical,1}},
                               {core,{logical,3}},
                               {core,{logical,2}}]}]},
            {node,[{processor,[{core,{logical,7}},
                               {core,{logical,4}},
                               {core,{logical,6}},
                               {core,{logical,5}}]}]}]

             As  long  as  real identifiers are correct it is okay to pass a CPU topology that is
             not a correct description of the CPU topology. When used with care this can actually
             be  very  useful.  This in order to trick the emulator to bind its schedulers as you
             want. For example, if you want to run multiple Erlang runtime systems  on  the  same
             machine,  you  want  to  reduce the amount of schedulers used and manipulate the CPU
             topology so that they bind to different logical CPUs. An example,  with  two  Erlang
             runtime systems on a quad core machine:

           % erl +sct L0-3c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname one
           % erl +sct L3-0c0-3 +sbt db +S3:2 -detached -noinput -noshell -sname two

             In  this  example  each  runtime  system  have  two  schedulers each online, and all
             schedulers online will run on different cores. If we change to one scheduler  online
             on  one  runtime  system,  and  three schedulers online on the other, all schedulers
             online will still run on different cores.

             Note that a faked CPU topology that does not reflect how the real CPU topology looks
             like is likely to decrease the performance of the runtime system.

             For more information, see erlang:system_info(cpu_topology).

           +sfwi Interval:
             Set  scheduler  forced wakeup interval. All run queues will be scanned each Interval
             milliseconds. While there are sleeping schedulers in the system, one scheduler  will
             be  woken  for  each  non-empty  run  queue found. An Interval of zero disables this
             feature, which also is the default.

             This feature has been introduced as a temporary  workaround  for  lengthy  executing
             native code, and native code that do not bump reductions properly in OTP. When these
             bugs have be fixed the +sfwi flag will be removed.

           +stbt BindType:
             Try to set scheduler bind type. The same as the +sbt flag with the exception of  how
             some  errors  are  handled.  For more information, see the documentation of the +sbt
             flag.

           +sws very_eager|eager|medium|lazy|very_lazy:
             Set scheduler wake cleanup threshold. Default is  medium.  This  flag  controls  how
             eager  schedulers  should  be  requesting wake up due to certain cleanup operations.
             When a lazy setting is used, more outstanding cleanup operations can be left  undone
             while  a  scheduler  is  idling. When an eager setting is used, schedulers will more
             frequently be woken, potentially increasing CPU-utilization.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +sws default|legacy:
             Set scheduler wakeup strategy. Default strategy changed in erts-5.10/OTP-R16A.  This
             strategy  was  previously known as proposal in OTP-R15. The legacy strategy was used
             as default from R13 up to and including R15.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +swt very_low|low|medium|high|very_high:
             Set scheduler wakeup threshold. Default is medium. The threshold determines when  to
             wake  up  sleeping  schedulers when more work than can be handled by currently awake
             schedulers exist. A low threshold will cause earlier wakeups, and a  high  threshold
             will  cause  later  wakeups.  Early  wakeups  will  distribute  work  over  multiple
             schedulers faster, but work will more easily bounce between schedulers.

             NOTE: This flag may be removed or changed at any time without prior notice.

           +spp Bool:
             Set default scheduler hint for port  parallelism.  If  set  to  true,  the  VM  will
             schedule  port  tasks  when it by this can improve the parallelism in the system. If
             set to false, the VM will try to perform port tasks immediately and by this  improve
             latency at the expense of parallelism. If this flag has not been passed, the default
             scheduler hint for port parallelism is currently false.  The  default  used  can  be
             inspected  in  runtime  by calling erlang:system_info(port_parallelism). The default
             can be overriden on port creation by passing the parallelism option to open_port/2.

           +sss size:
             Suggested stack size, in kilowords, for scheduler threads.  Valid  range  is  4-8192
             kilowords. The default stack size is OS dependent.

         +t size:
           Set the maximum number of atoms the VM can handle. Default is 1048576.

         +T Level:
           Enables  modified  timing and sets the modified timing level. Currently valid range is
           0-9. The timing of the runtime system will  change.  A  high  level  usually  means  a
           greater  change  than  a low level. Changing the timing can be very useful for finding
           timing related bugs.

           Currently, modified timing affects the following:

           Process spawning:
             A process calling spawn, spawn_link, spawn_monitor, or spawn_opt will  be  scheduled
             out  immediately  after  completing the call. When higher modified timing levels are
             used, the caller will also sleep for a while after being scheduled out.

           Context reductions:
             The amount of reductions a process is a allowed to use before being scheduled out is
             increased or reduced.

           Input reductions:
             The amount of reductions performed before checking I/O is increased or reduced.

           NOTE:  Performance  will  suffer  when  modified  timing is enabled. This flag is only
           intended for testing and debugging. Also note that  return_to  and  return_from  trace
           messages  will  be  lost  when  tracing on the spawn BIFs. This flag may be removed or
           changed at any time without prior notice.

         +V:
           Makes the emulator print out its version number.

         +v:
           Verbose.

         +W w | i:
           Sets the mapping of warning messages for error_logger.  Messages  sent  to  the  error
           logger  using  one  of  the warning routines can be mapped either to errors (default),
           warnings (+W w), or info reports (+W i). The current mapping can  be  retrieved  using
           error_logger:warning_map/0. See error_logger(3erl) for further information.

         +zFlag Value:
           Miscellaneous flags.

           +zdbbl size:
             Set  the  distribution  buffer  busy limit (dist_buf_busy_limit) in kilobytes. Valid
             range is 1-2097151. Default is 1024.

             A larger buffer limit will allow processes to buffer more outgoing messages over the
             distribution.  When  the  buffer  limit  has been reached, sending processes will be
             suspended until the buffer size has shrunk. The buffer  limit  is  per  distribution
             channel. A higher limit will give lower latency and higher throughput at the expense
             of higher memory usage.

ENVIRONMENT VARIABLES

         ERL_CRASH_DUMP:
           If the emulator needs to write a crash dump, the value of this variable  will  be  the
           file  name  of  the crash dump file. If the variable is not set, the name of the crash
           dump file will be erl_crash.dump in the current directory.

         ERL_CRASH_DUMP_NICE:
           Unix systems: If the emulator needs to write a crash dump, it will use  the  value  of
           this  variable  to set the nice value for the process, thus lowering its priority. The
           allowable range is 1 through 39 (higher values will be replaced with 39). The  highest
           value, 39, will give the process the lowest priority.

         ERL_CRASH_DUMP_SECONDS:
           Unix  systems:  This  variable  gives  the number of seconds that the emulator will be
           allowed to spend writing a crash dump. When the given number of seconds have  elapsed,
           the emulator will be terminated by a SIGALRM signal.

           If   the   environment   variable   is   not  set  or  it  is  set  to  zero  seconds,
           ERL_CRASH_DUMP_SECONDS=0, the runtime system will not even attempt to write the  crash
           dump file. It will just terminate.

           If  the environment variable is set to negative valie, e.g. ERL_CRASH_DUMP_SECONDS=-1,
           the runtime system will wait indefinitely for the crash dump file to be written.

           This environment variable is used in conjuction with heart if heart is running:

           ERL_CRASH_DUMP_SECONDS=0:
             Suppresses the writing a crash dump file entirely, thus rebooting the runtime system
             immediately. This is the same as not setting the environment variable.

           ERL_CRASH_DUMP_SECONDS=-1:
             Setting  the  environment variable to a negative value will cause the termination of
             the runtime system to wait until the crash dump file has been completly written.

           ERL_CRASH_DUMP_SECONDS=S:
             Will wait for S seconds to complete the crash  dump  file  and  then  terminate  the
             runtime system.

         ERL_AFLAGS:
           The content of this environment variable will be added to the beginning of the command
           line for erl.

           The -extra flag is treated specially. Its scope ends at the  end  of  the  environment
           variable  content.  Arguments  following  an -extra flag are moved on the command line
           into the -extra section, i.e. the end of the command line following  after  an  -extra
           flag.

         ERL_ZFLAGS and ERL_FLAGS:
           The  content  of  these  environment variables will be added to the end of the command
           line for erl.

           The -extra flag is treated specially. Its scope ends at the  end  of  the  environment
           variable  content.  Arguments  following  an -extra flag are moved on the command line
           into the -extra section, i.e. the end of the command line following  after  an  -extra
           flag.

         ERL_LIBS:
           This  environment  variable contains a list of additional library directories that the
           code server will search for applications and add to the code path. See code(3erl).

         ERL_EPMD_ADDRESS:
           This environment variable may be set to a comma-separated list  of  IP  addresses,  in
           which  case  the  epmd daemon will listen only on the specified address(es) and on the
           loopback address (which is implicitly added to the list if it has not been specified).

         ERL_EPMD_PORT:
           This environment variable can contain the port number to use when  communicating  with
           epmd. The default port will work fine in most cases. A different port can be specified
           to allow nodes of independent clusters to co-exist on the same host. All  nodes  in  a
           cluster must use the same epmd port number.

CONFIGURATION

       The  standard  Erlang/OTP  system  can  be re-configured to change the default behavior on
       start-up.

         The .erlang Start-up File:
           When Erlang/OTP is started, the system searches  for  a  file  named  .erlang  in  the
           directory  where  Erlang/OTP  is  started.  If not found, the user's home directory is
           searched for an .erlang file.

           If an .erlang file is found, it is assumed to contain valid Erlang expressions.  These
           expressions are evaluated as if they were input to the shell.

           A typical .erlang file contains a set of search paths, for example:

                 io:format("executing user profile in HOME/.erlang\n",[]).
                 code:add_path("/home/calvin/test/ebin").
                 code:add_path("/home/hobbes/bigappl-1.2/ebin").
                 io:format(".erlang rc finished\n",[]).

         user_default and shell_default:
           Functions  in  the  shell  which  are  not prefixed by a module name are assumed to be
           functional objects  (Funs),  built-in  functions  (BIFs),  or  belong  to  the  module
           user_default or shell_default.

           To  include  private  shell commands, define them in a module user_default and add the
           following argument as the first line in the .erlang file.

                  code:load_abs("..../user_default").

         erl:
           If the contents of .erlang are changed  and  a  private  version  of  user_default  is
           defined, it is possible to customize the Erlang/OTP environment. More powerful changes
           can be made by supplying command line arguments in the start-up script erl.  Refer  to
           erl(1) and init(3erl) for further information.

SEE ALSO

       init(3erl),  erl_prim_loader(3erl),  erl_boot_server(3erl), code(3erl), application(3erl),
       heart(3erl), net_kernel(3erl), auth(3erl), make(3erl), epmd(1), erts_alloc(3erl)