module Process
Module Process represents a process in the underlying operating system. Its methods support management of the current process and its child processes.
Process Creation
Each of the following methods executes a given command in a new process or subshell, or multiple commands in new processes and/or subshells. The choice of process or subshell depends on the form of the command; see Argument command_line or exe_path.
-
Process.spawn, Kernel#spawn: Executes the command; returns the new pid without waiting for completion.
-
Process.exec: Replaces the current process by executing the command.
In addition:
-
MethodKernel#system executes a given command-line (string) in a subshell; returnstrue,false, ornil. -
MethodKernel#` executes a given command-line (string) in a subshell; returns its $stdout string. -
ModuleOpen3supports creating child processes with access to their $stdin, $stdout, and $stderr streams.
Execution Environment
Optional leading argument env is a hash of name/value pairs, where each name is a string and each value is a string or nil; each name/value pair is added to ENV in the new process.
Process.spawn( 'ruby -e "p ENV[\"Foo\"]"') Process.spawn({'Foo' => '0'}, 'ruby -e "p ENV[\"Foo\"]"')
Output:
"0"
The effect is usually similar to that of calling ENV#update with argument env, where each named environment variable is created or updated (if the value is non-nil), or deleted (if the value is nil).
However, some modifications to the calling process may remain if the new process fails. For example, hard resource limits are not restored.
Argument command_line or exe_path
The required string argument is one of the following:
-
command_lineif it begins with a shell reserved word or special built-in, or if it contains one or more meta characters. -
exe_pathotherwise.
Argument command_line
String argument command_line is a command line to be passed to a shell; it must begin with a shell reserved word, begin with a special built-in, or contain meta characters:
system('if true; then echo "Foo"; fi') # => true # Shell reserved word. system('exit') # => true # Built-in. system('date > /tmp/date.tmp') # => true # Contains meta character. system('date > /nop/date.tmp') # => false system('date > /nop/date.tmp', exception: true) # Raises RuntimeError.
The command line may also contain arguments and options for the command:
system('echo "Foo"') # => true
Output:
Foo
See Execution Shell for details about the shell.
Argument exe_path
Argument exe_path is one of the following:
-
The string path to an executable file to be called:
Example:
system('/usr/bin/date') # => true # Path to date on Unix-style system. system('foo') # => nil # Command execlution failed.
Output:
Thu Aug 31 10:06:48 AM CDT 2023
A path or command name containing spaces without arguments cannot be distinguished from
command_lineabove, so you must quote or escape the entire command name using a shell in platform dependent manner, or use the array form below.If
exe_pathdoes not contain any path separator, an executable file is searched from directories specified with thePATHenvironment variable. What the word "executable" means here is depending on platforms.Even if the file considered "executable", its content may not be in proper executable format. In that case,
Rubytries to run it by using/bin/shon a Unix-like system, like system(3) does.File.write('shell_command', 'echo $SHELL', perm: 0o755) system('./shell_command') # prints "/bin/sh" or something.
-
A 2-element array containing the path to an executable and the string to be used as the name of the executing process:
Example:
pid = spawn(['sleep', 'Hello!'], '1') # 2-element array. p `ps -p #{pid} -o command=`
Output:
"Hello! 1\n"
Arguments args
If command_line does not contain shell meta characters except for spaces and tabs, or exe_path is given, Ruby invokes the executable directly. This form does not use the shell:
spawn("doesnt_exist") # Raises Errno::ENOENT spawn("doesnt_exist", "\n") # Raises Errno::ENOENT spawn("doesnt_exist\n") # => false # sh: 1: doesnot_exist: not found
The error message is from a shell and would vary depending on your system.
If one or more args is given after exe_path, each is an argument or option to be passed to the executable:
Example:
system('echo', '<', 'C*', '|', '$SHELL', '>') # => true
Output:
< C* | $SHELL >
However, there are exceptions on Windows. See Execution Shell on Windows.
If you want to invoke a path containing spaces with no arguments without shell, you will need to use a 2-element array exe_path.
Example:
path = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' spawn(path) # Raises Errno::ENOENT; No such file or directory - /Applications/Google spawn([path] * 2)
Execution Options
Optional trailing argument options is a hash of execution options.
Working Directory (:chdir)
By default, the working directory for the new process is the same as that of the current process:
Dir.chdir('/var') Process.spawn('ruby -e "puts Dir.pwd"')
Output:
/var
Use option :chdir to set the working directory for the new process:
Process.spawn('ruby -e "puts Dir.pwd"', {chdir: '/tmp'})
Output:
/tmp
The working directory of the current process is not changed:
Dir.pwd # => "/var"
File Redirection (File Descriptor)
Use execution options for file redirection in the new process.
The key for such an option may be an integer file descriptor (fd), specifying a source, or an array of fds, specifying multiple sources.
An integer source fd may be specified as:
-
n: Specifies file descriptor n.
There are these shorthand symbols for fds:
-
:in: Specifies file descriptor 0 (STDIN). -
:out: Specifies file descriptor 1 (STDOUT). -
:err: Specifies file descriptor 2 (STDERR).
The value given with a source is one of:
-
n: Redirects to fd n in the parent process.
-
filepath: Redirects from or to the file atfilepathviaopen(filepath, mode, 0644), wheremodeis'r'for source:in, or'w'for source:outor:err. -
[filepath]: Redirects from the file atfilepathviaopen(filepath, 'r', 0644). -
[filepath, mode]: Redirects from or to the file atfilepathviaopen(filepath, mode, 0644). -
[filepath, mode, perm]: Redirects from or to the file atfilepathviaopen(filepath, mode, perm). -
[:child, fd]: Redirects to the redirectedfd. -
:close: Closes the file descriptor in child process.
See Access Modes and File Permissions.
Environment Variables (:unsetenv_others)
By default, the new process inherits environment variables from the parent process; use execution option key :unsetenv_others with value true to clear environment variables in the new process.
Any changes specified by execution option env are made after the new process inherits or clears its environment variables; see Execution Environment.
File-Creation Access (:umask)
Use execution option :umask to set the file-creation access for the new process; see Access Modes:
command = 'ruby -e "puts sprintf(\"0%o\", File.umask)"' options = {:umask => 0644} Process.spawn(command, options)
Output:
0644
Process Groups (:pgroup and :new_pgroup)
By default, the new process belongs to the same process group as the parent process.
To specify a different process group. use execution option :pgroup with one of the following values:
-
true: Create a new process group for the new process. -
pgid: Create the new process in the process group whose id is pgid.
On Windows only, use execution option :new_pgroup with value true to create a new process group for the new process.
Resource Limits
Use execution options to set resource limits.
The keys for these options are symbols of the form :rlimit_<i>resource_name</i>, where resource_name is the downcased form of one of the string resource names described at method Process.setrlimit. For example, key :rlimit_cpu corresponds to resource limit 'CPU'.
The value for such as key is one of:
-
An integer, specifying both the current and maximum limits.
-
A 2-element array of integers, specifying the current and maximum limits.
File Descriptor Inheritance
By default, the new process inherits file descriptors from the parent process.
Use execution option :close_others => true to modify that inheritance by closing non-standard fds (3 and greater) that are not otherwise redirected.
Execution Shell
On a Unix-like system, the shell invoked is /bin/sh; the entire string command_line is passed as an argument to [shell option -c](pubs.opengroup.org/onlinepubs/9699919799.2018edition/utilities/sh. html).
The shell performs normal shell expansion on the command line:
Example:
system('echo $SHELL: C*') # => true
Output:
/bin/bash: CONTRIBUTING.md COPYING COPYING.ja
Execution Shell on Windows
On Windows, the shell invoked is determined by environment variable RUBYSHELL, if defined, or COMSPEC otherwise; the entire string command_line is passed as an argument to -c option for RUBYSHELL, as well as /bin/sh, and [/c option](learn.microsoft.com/en-us/windows-server/administration/window s-commands/cmd) for COMSPEC. The shell is invoked automatically in the following cases:
-
The command is a built-in of
cmd.exe, such asecho. -
The executable file is a batch file; its name ends with
.bator.cmd.
Note that the command will still be invoked as command_line form even when called in exe_path form, because cmd.exe does not accept a script name like /bin/sh does but only works with /c option.
The standard shell cmd.exe performs environment variable expansion but does not have globbing functionality:
Example:
system("echo %COMSPEC%: C*")' # => true
Output:
C:\WINDOWS\system32\cmd.exe: C*
What’s Here
Current-Process Getters
-
::argv0: Returns the process name as a frozen string. -
::egid: Returns the effective group ID. -
::euid: Returns the effective user ID. -
::getpgrp: Return the process group ID. -
::getrlimit: Returns the resource limit. -
::gid: Returns the (real) group ID. -
::pid: Returns the process ID. -
::ppid: Returns the process ID of the parent process. -
::uid: Returns the (real) user ID.
Current-Process Setters
-
::egid=: Sets the effective group ID. -
::euid=: Sets the effective user ID. -
::gid=: Sets the (real) group ID. -
::setproctitle: Sets the process title. -
::setpgrp: Sets the process group ID of the process to zero.
-
::setrlimit: Sets a resource limit. -
::setsid: Establishes the process as a new session and process group leader, with no controlling tty. -
::uid=: Sets the user ID.
Current-Process Execution
-
::abort: Immediately terminates the process.
-
::daemon: Detaches the process from its controlling terminal and continues running it in the background as system daemon. -
::exec: Replaces the process by running a given external command.
-
::exit: Initiates process termination by raising exception
SystemExit(which may be caught). -
::exit!: Immediately exits the process.
-
::warmup: Notifies theRubyvirtual machine that the boot sequence for the application is completed, and that the VM may begin optimizing the application.
Child Processes
-
::detach: Guards against a child process becoming a zombie. -
::fork: Creates a child process.
-
::kill: Sends a given signal to processes. -
::spawn: Creates a child process.
-
::wait,::waitpid: Waits for a child process to exit; returns its process ID. -
::wait2,::waitpid2: Waits for a child process to exit; returns its process ID and status. -
::waitall: Waits for all child processes to exit; returns their process IDs and statuses.
Process Groups
-
::getpgid: Returns the process group ID for a process. -
::getpriority: Returns the scheduling priority for a process, process group, or user. -
::getsid: Returns the session ID for a process. -
::groups: Returns an array of the group IDs in the supplemental group access list for this process. -
::groups=: Sets the supplemental group access list to the given array of group IDs. -
::initgroups: Initializes the supplemental group access list. -
::last_status: Returns the status of the last executed child process in the current thread.
-
::maxgroups: Returns the maximum number of group IDs allowed in the supplemental group access list. -
::maxgroups=: Sets the maximum number of group IDs allowed in the supplemental group access list. -
::setpgid: Sets the process group ID of a process. -
::setpriority: Sets the scheduling priority for a process, process group, or user.
Timing
-
::clock_getres: Returns the resolution of a system clock. -
::clock_gettime: Returns the time from a system clock. -
::times: Returns aProcess::Tmsobject containing times for the current process and its child processes.
Public Class Methods
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 426
def self._fork: () -> Integer
An internal API for fork. Do not call this method directly. Currently, this is called via Kernel#fork, Process.fork, and IO.popen with "-".
This method is not for casual code but for application monitoring libraries. You can add custom code before and after fork events by overriding this method.
Note: Process.daemon may be implemented using fork(2) BUT does not go through this method. Thus, depending on your reason to hook into this method, you may also want to hook into that one. See this issue for a more detailed discussion of this.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 438
def self.argv0: () -> String
Returns the name of the script being executed. The value is not affected by assigning a new value to $0.
This method first appeared in Ruby 2.1 to serve as a global variable free means to get the script name.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 474
def self.clock_getres: (Symbol | Integer clock_id, ?Symbol unit) -> (Float | Integer)
Returns a clock resolution as determined by POSIX function clock_getres():
Process.clock_getres(:CLOCK_REALTIME) # => 1.0e-09
See Process.clock_gettime for the values of clock_id and unit.
Examples:
Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :float_microsecond) # => 0.001 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :float_millisecond) # => 1.0e-06 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :float_second) # => 1.0e-09 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :microsecond) # => 0 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :millisecond) # => 0 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :nanosecond) # => 1 Process.clock_getres(:CLOCK_PROCESS_CPUTIME_ID, :second) # => 0
In addition to the values for unit supported in Process.clock_gettime, this method supports :hertz, the integer number of clock ticks per second (which is the reciprocal of :float_second):
Process.clock_getres(:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID, :hertz) # => 100.0 Process.clock_getres(:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID, :float_second) # => 0.01
Accuracy: Note that the returned resolution may be inaccurate on some platforms due to underlying bugs. Inaccurate resolutions have been reported for various clocks including :CLOCK_MONOTONIC and :CLOCK_MONOTONIC_RAW on Linux, macOS, BSD or AIX platforms, when using ARM processors, or when using virtualization.
(Symbol | Integer clock_id) → Float
(Symbol | Integer clock_id, :float_second | :float_millisecond | :float_microsecond unit) → Float
(Symbol | Integer clock_id, :second | :millisecond | :microsecond | :nanosecond unit) → Integer
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 633
def self.clock_gettime: (Symbol | Integer clock_id) -> Float
| (Symbol | Integer clock_id, :float_second | :float_millisecond | :float_microsecond unit) -> Float
| (Symbol | Integer clock_id, :second | :millisecond | :microsecond | :nanosecond unit) -> Integer
Returns a clock time as determined by POSIX function clock_gettime():
Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID) # => 198.650379677
Argument clock_id should be a symbol or a constant that specifies the clock whose time is to be returned; see below.
Optional argument unit should be a symbol that specifies the unit to be used in the returned clock time; see below.
<strong>Argument clock_id</strong>
Argument clock_id specifies the clock whose time is to be returned; it may be a constant such as Process::CLOCK_REALTIME, or a symbol shorthand such as :CLOCK_REALTIME.
The supported clocks depend on the underlying operating system; this method supports the following clocks on the indicated platforms (raises Errno::EINVAL if called with an unsupported clock):
-
:CLOCK_BOOTTIME: Linux 2.6.39. -
:CLOCK_BOOTTIME_ALARM: Linux 3.0. -
:CLOCK_MONOTONIC: SUSv3 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 3.4, macOS 10.12, Windows-2000. -
:CLOCK_MONOTONIC_COARSE: Linux 2.6.32. -
:CLOCK_MONOTONIC_FAST: FreeBSD 8.1. -
:CLOCK_MONOTONIC_PRECISE: FreeBSD 8.1. -
:CLOCK_MONOTONIC_RAW: Linux 2.6.28, macOS 10.12. -
:CLOCK_MONOTONIC_RAW_APPROX: macOS 10.12. -
:CLOCK_PROCESS_CPUTIME_ID: SUSv3 to 4, Linux 2.5.63, FreeBSD 9.3, OpenBSD 5.4, macOS 10.12. -
:CLOCK_PROF: FreeBSD 3.0, OpenBSD 2.1. -
:CLOCK_REALTIME: SUSv2 to 4, Linux 2.5.63, FreeBSD 3.0, NetBSD 2.0, OpenBSD 2.1, macOS 10.12, Windows-8/Server-2012.Time.nowis recommended over +:CLOCK_REALTIME:. -
:CLOCK_REALTIME_ALARM: Linux 3.0. -
:CLOCK_REALTIME_COARSE: Linux 2.6.32. -
:CLOCK_REALTIME_FAST: FreeBSD 8.1. -
:CLOCK_REALTIME_PRECISE: FreeBSD 8.1. -
:CLOCK_SECOND: FreeBSD 8.1. -
:CLOCK_TAI: Linux 3.10. -
:CLOCK_THREAD_CPUTIME_ID: SUSv3 to 4, Linux 2.5.63, FreeBSD 7.1, OpenBSD 5.4, macOS 10.12. -
:CLOCK_UPTIME: FreeBSD 7.0, OpenBSD 5.5. -
:CLOCK_UPTIME_FAST: FreeBSD 8.1. -
:CLOCK_UPTIME_PRECISE: FreeBSD 8.1. -
:CLOCK_UPTIME_RAW: macOS 10.12. -
:CLOCK_UPTIME_RAW_APPROX: macOS 10.12. -
:CLOCK_VIRTUAL: FreeBSD 3.0, OpenBSD 2.1.
Note that SUS stands for Single Unix Specification. SUS contains POSIX and clock_gettime is defined in the POSIX part. SUS defines :CLOCK_REALTIME as mandatory but :CLOCK_MONOTONIC, :CLOCK_PROCESS_CPUTIME_ID, and :CLOCK_THREAD_CPUTIME_ID are optional.
Certain emulations are used when the given clock_id is not supported directly:
-
Emulations for
:CLOCK_REALTIME:-
:GETTIMEOFDAY_BASED_CLOCK_REALTIME: Use gettimeofday() defined by SUS (deprecated in SUSv4). The resolution is 1 microsecond. -
:TIME_BASED_CLOCK_REALTIME: Use time() defined by ISO C. The resolution is 1 second.
-
-
Emulations for
:CLOCK_MONOTONIC:-
:MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC: Use mach_absolute_time(), available on Darwin. The resolution is CPU dependent. -
:TIMES_BASED_CLOCK_MONOTONIC: Use the result value of times() defined by POSIX, thus:Upon successful completion, times() shall return the elapsed real time, in clock ticks, since an arbitrary point in the past (for example, system start-up time).
-
For example, GNU/Linux returns a value based on jiffies and it is monotonic. However, 4.4BSD uses gettimeofday() and it is not monotonic. (FreeBSD uses
:CLOCK_MONOTONICinstead, though.)
The resolution is the clock tick. "getconf CLK_TCK" command shows the
clock ticks per second. (The clock ticks-per-second is defined by HZ
macro in older systems.) If it is 100 and clock_t is 32 bits integer
type, the resolution is 10 millisecond and cannot represent over 497
days.
-
Emulations for
:CLOCK_PROCESS_CPUTIME_ID:-
:GETRUSAGE_BASED_CLOCK_PROCESS_CPUTIME_ID: Use getrusage() defined by SUS. getrusage() is used with RUSAGE_SELF to obtain the time only for the calling process (excluding the time for child processes). The result is addition of user time (ru_utime) and system time (ru_stime). The resolution is 1 microsecond. -
:TIMES_BASED_CLOCK_PROCESS_CPUTIME_ID: Use times() defined by POSIX. The result is addition of user time (tms_utime) and system time (tms_stime). tms_cutime and tms_cstime are ignored to exclude the time for child processes. The resolution is the clock tick. "getconf CLK_TCK" command shows the clock ticks per second. (The clock ticks per second is defined by HZ macro in older systems.) If it is 100, the resolution is 10 millisecond. -
:CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID: Use clock() defined by ISO C. The resolution is1/CLOCKS_PER_SEC.CLOCKS_PER_SECis the C-level macro defined by time.h. SUS definesCLOCKS_PER_SECas 1000000; other systems may define it differently. IfCLOCKS_PER_SECis 1000000 (as in SUS), the resolution is 1 microsecond. IfCLOCKS_PER_SECis 1000000 and clock_t is a 32-bit integer type, it cannot represent over 72 minutes.
-
<strong>Argument unit</strong>
Optional argument unit (default :float_second) specifies the unit for the returned value.
-
:float_microsecond: Number of microseconds as a float. -
:float_millisecond: Number of milliseconds as a float. -
:float_second: Number of seconds as a float. -
:microsecond: Number of microseconds as an integer. -
:millisecond: Number of milliseconds as an integer. -
:nanosecond: Number of nanoseconds as an integer. -
:second: Number of seconds as an integer.
Examples:
Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :float_microsecond) # => 203605054.825 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :float_millisecond) # => 203643.696848 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :float_second) # => 203.762181929 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :microsecond) # => 204123212 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :millisecond) # => 204298 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :nanosecond) # => 204602286036 Process.clock_gettime(:CLOCK_PROCESS_CPUTIME_ID, :second) # => 204
The underlying function, clock_gettime(), returns a number of nanoseconds. Float object (IEEE 754 double) is not enough to represent the return value for :CLOCK_REALTIME. If the exact nanoseconds value is required, use :nanosecond as the unit.
The origin (time zero) of the returned value is system-dependent, and may be, for example, system start up time, process start up time, the Epoch, etc.
The origin in :CLOCK_REALTIME is defined as the Epoch: 1970-01-01 00:00:00 UTC; some systems count leap seconds and others don’t, so the result may vary across systems.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 655
def self.daemon: (?untyped nochdir, ?untyped noclose) -> Integer
Detaches the current process from its controlling terminal and runs it in the background as system daemon; returns zero.
By default:
-
Changes the current working directory to the root directory.
-
Redirects $stdin, $stdout, and $stderr to the null device.
If optional argument nochdir is true, does not change the current working directory.
If optional argument noclose is true, does not redirect $stdin, $stdout, or $stderr.
(Integer pid) → Process::Waiter
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 694
def self.detach: (Integer pid) -> Process::Waiter
Avoids the potential for a child process to become a zombie process. Process.detach prevents this by setting up a separate Ruby thread whose sole job is to reap the status of the process pid when it terminates.
This method is needed only when the parent process will never wait for the child process.
This example does not reap the second child process; that process appears as a zombie in the process status (ps) output:
pid = Process.spawn('ruby', '-e', 'exit 13') # => 312691 sleep(1) # Find zombies. system("ps -ho pid,state -p #{pid}")
Output:
312716 Z
This example also does not reap the second child process, but it does detach the process so that it does not become a zombie:
pid = Process.spawn('ruby', '-e', 'exit 13') # => 313213 thread = Process.detach(pid) sleep(1) # => #<Process::Waiter:0x00007f038f48b838 run> system("ps -ho pid,state -p #{pid}") # Finds no zombies.
The waiting thread can return the pid of the detached child process:
thread.join.pid # => 313262
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 708
def self.egid: () -> Integer
Returns the effective group ID for the current process:
Process.egid # => 500
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 718
def self.egid=: (Integer arg0) -> Integer
Sets the effective group ID for the current process.
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 730
def self.euid: () -> Integer
Returns the effective user ID for the current process.
Process.euid # => 501
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 740
def self.euid=: (Integer arg0) -> Integer
Sets the effective user ID for the current process.
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 752
def self.getpgid: (Integer pid) -> Integer
Returns the process group ID for the given process ID +pid+:
Process.getpgid(Process.ppid) # => 25527
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 763
def self.getpgrp: () -> Integer
Returns the process group ID for the current process:
Process.getpgid(0) # => 25527 Process.getpgrp # => 25527
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 787
def self.getpriority: (Integer kind, Integer arg0) -> Integer
Returns the scheduling priority for specified process, process group, or user.
Argument kind is one of:
-
Process::PRIO_PROCESS: return priority for process.
-
Process::PRIO_PGRP: return priority for process group.
-
Process::PRIO_USER: return priority for user.
Argument id is the ID for the process, process group, or user; zero specified the current ID for kind.
Examples:
Process.getpriority(Process::PRIO_USER, 0) # => 19 Process.getpriority(Process::PRIO_PROCESS, 0) # => 19
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 810
def self.getrlimit: (interned | Integer resource) -> [ Integer, Integer ]
Returns a 2-element array of the current (soft) limit and maximum (hard) limit for the given resource.
Argument resource specifies the resource whose limits are to be returned; see Process.setrlimit.
Each of the returned values cur_limit and max_limit is an integer; see Process.setrlimit.
Example:
Process.getrlimit(:CORE) # => [0, 18446744073709551615]
See Process.setrlimit.
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 825
def self.getsid: (?Integer pid) -> Integer
Returns the session ID of the given process ID pid, or of the current process if not given:
Process.getsid # => 27422 Process.getsid(0) # => 27422 Process.getsid(Process.pid()) # => 27422
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 837
def self.gid: () -> Integer
Returns the (real) group ID for the current process:
Process.gid # => 1000
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 847
def self.gid=: (Integer arg0) -> Integer
Sets the group ID for the current process to new_gid:
Process.gid = 1000 # => 1000
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 869
def self.groups: () -> ::Array[Integer]
Returns an array of the group IDs in the supplemental group access list for the current process:
Process.groups # => [4, 24, 27, 30, 46, 122, 135, 136, 1000]
These properties of the returned array are system-dependent:
-
Whether (and how) the array is sorted.
-
Whether the array includes effective group IDs.
-
Whether the array includes duplicate group IDs.
-
Whether the array size exceeds the value of
Process.maxgroups.
Use this call to get a sorted and unique array:
Process.groups.uniq.sort
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 881
def self.groups=: (::Array[Integer] arg0) -> ::Array[Integer]
Sets the supplemental group access list to the given array of group IDs.
Process.groups # => [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] Process.groups = [27, 6, 10, 11] # => [27, 6, 10, 11] Process.groups # => [27, 6, 10, 11]
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 901
def self.initgroups: (String username, Integer gid) -> ::Array[Integer]
Sets the supplemental group access list; the new list includes:
-
The group IDs of those groups to which the user given by
usernamebelongs. -
The group ID
gid.
Example:
Process.groups # => [0, 1, 2, 3, 4, 6, 10, 11, 20, 26, 27] Process.initgroups('me', 30) # => [30, 6, 10, 11] Process.groups # => [30, 6, 10, 11]
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 972
def self.kill: (Integer | interned signal, *Integer pids) -> Integer
Sends a signal to each process specified by ids (which must specify at least one ID); returns the count of signals sent.
For each given id, if id is:
-
Positive, sends the signal to the process whose process ID is
id. -
Zero, send the signal to all processes in the current process group.
-
Negative, sends the signal to a system-dependent collection of processes.
Argument signal specifies the signal to be sent; the argument may be:
-
An integer signal number: e.g.,
-29,0,29. -
A signal name (string), with or without leading
'SIG', and with or without a further prefixed minus sign ('-'): e.g.:-
'SIGPOLL'. -
'POLL', -
'-SIGPOLL'. -
'-POLL'.
-
-
A signal symbol, with or without leading
'SIG', and with or without a further prefixed minus sign ('-'): e.g.:-
:SIGPOLL. -
:POLL. -
:'-SIGPOLL'. -
:'-POLL'.
-
If signal is:
-
A non-negative integer, or a signal name or symbol without prefixed
'-', each process with process IDidis signalled. -
A negative integer, or a signal name or symbol with prefixed
'-', each process group with group IDidis signalled.
Use method Signal.list to see which signals are supported by Ruby on the underlying platform; the method returns a hash of the string names and non-negative integer values of the supported signals. The size and content of the returned hash varies widely among platforms.
Additionally, signal 0 is useful to determine if the process exists.
Example:
pid = fork do Signal.trap('HUP') { puts 'Ouch!'; exit } # ... do some work ... end # ... Process.kill('HUP', pid) Process.wait
Output:
Ouch!
Exceptions:
-
Raises
Errno::EINVALorRangeErrorifsignalis an integer but invalid. -
Raises
ArgumentErrorifsignalis a string or symbol but invalid. -
Raises
Errno::ESRCHorRangeErrorif one ofidsis invalid. -
Raises
Errno::EPERMif needed permissions are not in force.
In the last two cases, signals may have been sent to some processes.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 983
def self.maxgroups: () -> Integer
Returns the maximum number of group IDs allowed in the supplemental group access list:
Process.maxgroups # => 32
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 992
def self.maxgroups=: (Integer arg0) -> Integer
Sets the maximum number of group IDs allowed in the supplemental group access list.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1002
def self.pid: () -> Integer
Returns the process ID of the current process:
Process.pid # => 15668
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1020
def self.ppid: () -> Integer
Returns the process ID of the parent of the current process:
puts "Pid is #{Process.pid}." fork { puts "Parent pid is #{Process.ppid}." }
Output:
Pid is 271290. Parent pid is 271290.
May not return a trustworthy value on certain platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1030
def self.setpgid: (Integer pid, Integer arg0) -> Integer
Sets the process group ID for the process given by process ID pid to pgid.
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1047
def self.setpriority: (Integer kind, Integer arg0, Integer priority) -> Integer
See Process.getpriority.
Examples:
Process.setpriority(Process::PRIO_USER, 0, 19) # => 0 Process.setpriority(Process::PRIO_PROCESS, 0, 19) # => 0 Process.getpriority(Process::PRIO_USER, 0) # => 19 Process.getpriority(Process::PRIO_PROCESS, 0) # => 19
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1065
def self.setproctitle: (String arg0) -> String
Sets the process title that appears on the ps(1) command. Not necessarily effective on all platforms. No exception will be raised regardless of the result, nor will NotImplementedError be raised even if the platform does not support the feature.
Calling this method does not affect the value of $0.
Process.setproctitle('myapp: worker #%d' % worker_id)
This method first appeared in Ruby 2.1 to serve as a global variable free means to change the process title.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1124
def self.setrlimit: (interned | Integer resource, Integer cur_limit, ?Integer max_limit) -> nil
Sets limits for the current process for the given resource to cur_limit (soft limit) and max_limit (hard limit); returns nil.
Argument resource specifies the resource whose limits are to be set; the argument may be given as a symbol, as a string, or as a constant beginning with Process::RLIMIT_ (e.g., :CORE, 'CORE', or Process::RLIMIT_CORE.
The resources available and supported are system-dependent, and may include (here expressed as symbols):
-
:AS: Total available memory (bytes) (SUSv3, NetBSD, FreeBSD, OpenBSD except 4.4BSD-Lite). -
:CORE: Core size (bytes) (SUSv3). -
:CPU: CPU time (seconds) (SUSv3). -
:DATA:Datasegment (bytes) (SUSv3). -
:FSIZE:Filesize (bytes) (SUSv3). -
:MEMLOCK: Total size for mlock(2) (bytes) (4.4BSD, GNU/Linux). -
:MSGQUEUE: Allocation for POSIX message queues (bytes) (GNU/Linux). -
:NICE: Ceiling on process’s nice(2) value (number) (GNU/Linux). -
:NOFILE:Filedescriptors (number) (SUSv3). -
:NPROC: Number of processes for the user (number) (4.4BSD, GNU/Linux). -
:NPTS: Number of pseudo terminals (number) (FreeBSD). -
:RSS: Resident memory size (bytes) (4.2BSD, GNU/Linux). -
:RTPRIO: Ceiling on the process’s real-time priority (number) (GNU/Linux). -
:RTTIME: CPU time for real-time process (us) (GNU/Linux). -
:SBSIZE: All socket buffers (bytes) (NetBSD, FreeBSD). -
:SIGPENDING: Number of queued signals allowed (signals) (GNU/Linux). -
:STACK: Stack size (bytes) (SUSv3).
Arguments cur_limit and max_limit may be:
-
Integers (
max_limitshould not be smaller thancur_limit). -
Symbol:SAVED_MAX, string'SAVED_MAX', or constantProcess::RLIM_SAVED_MAX: saved maximum limit. -
Symbol:SAVED_CUR, string'SAVED_CUR', or constantProcess::RLIM_SAVED_CUR: saved current limit. -
Symbol:INFINITY, string'INFINITY', or constantProcess::RLIM_INFINITY: no limit on resource.
This example raises the soft limit of core size to the hard limit to try to make core dump possible:
Process.setrlimit(:CORE, Process.getrlimit(:CORE)[1])
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1137
def self.setsid: () -> Integer
Establishes the current process as a new session and process group leader, with no controlling tty; returns the session ID:
Process.setsid # => 27422
Not available on all platforms.
() → Process::Tms
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1151
def self.times: () -> Process::Tms
Returns a Process::Tms structure that contains user and system CPU times for the current process, and for its children processes:
Process.times # => #<struct Process::Tms utime=55.122118, stime=35.533068, cutime=0.0, cstime=0.002846>
The precision is platform-defined.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1163
def self.uid: () -> Integer
Returns the (real) user ID of the current process.
Process.uid # => 1000
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1175
def self.uid=: (Integer user) -> Integer
Sets the (user) user ID for the current process to new_uid:
Process.uid = 1000 # => 1000
Not available on all platforms.
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1311
def self.wait: (?Integer pid, ?Integer flags) -> Integer
Waits for a suitable child process to exit, returns its process ID, and sets $? to a Process::Status object containing information on that process. Which child it waits for depends on the value of the given pid:
-
Positive integer: Waits for the child process whose process ID is
pid:pid0 = Process.spawn('ruby', '-e', 'exit 13') # => 230866 pid1 = Process.spawn('ruby', '-e', 'exit 14') # => 230891 Process.wait(pid0) # => 230866 $? # => #<Process::Status: pid 230866 exit 13> Process.wait(pid1) # => 230891 $? # => #<Process::Status: pid 230891 exit 14> Process.wait(pid0) # Raises Errno::ECHILD
-
0: Waits for any child process whose group ID is the same as that of the current process:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." end retrieved_pid = Process.wait(0) puts "Process.wait(0) returned pid #{retrieved_pid}, which is child 0 pid." begin Process.wait(0) rescue Errno::ECHILD => x puts "Raised #{x.class}, because child 1 process group ID differs from parent process group ID." end
Output:
Parent process group ID is 225764. Child 0 pid is 225788 Child 0 process group ID is 225764 (same as parent's). Child 1 pid is 225789 Child 1 process group ID is 225789 (different from parent's). Process.wait(0) returned pid 225788, which is child 0 pid. Raised Errno::ECHILD, because child 1 process group ID differs from parent process group ID.
-
-1(default): Waits for any child process:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." sleep 3 # To force child 1 to exit later than child 0 exit. end child_pids = [child0_pid, child1_pid] retrieved_pid = Process.wait(-1) puts child_pids.include?(retrieved_pid) retrieved_pid = Process.wait(-1) puts child_pids.include?(retrieved_pid)
Output:
Parent process group ID is 228736. Child 0 pid is 228758 Child 0 process group ID is 228736 (same as parent's). Child 1 pid is 228759 Child 1 process group ID is 228759 (different from parent's). true true
-
Less than
-1: Waits for any child whose process group ID is-pid:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." end sleep 1 retrieved_pid = Process.wait(-child1_pid) puts "Process.wait(-child1_pid) returned pid #{retrieved_pid}, which is child 1 pid." begin Process.wait(-child1_pid) rescue Errno::ECHILD => x puts "Raised #{x.class}, because there's no longer a child with process group id #{child1_pid}." end
Output:
Parent process group ID is 230083. Child 0 pid is 230108 Child 0 process group ID is 230083 (same as parent's). Child 1 pid is 230109 Child 1 process group ID is 230109 (different from parent's). Process.wait(-child1_pid) returned pid 230109, which is child 1 pid. Raised Errno::ECHILD, because there's no longer a child with process group id 230109.
Argument flags should be given as one of the following constants, or as the logical OR of both:
-
Process::WNOHANG: Does not block if no child process is available.
-
Process::WUNTRACED: May return a stopped child process, even if not yet reported.
Not all flags are available on all platforms.
Raises Errno::ECHILD if there is no suitable child process.
Not available on all platforms.
Process.waitpid is an alias for Process.wait.
(?Integer pid, ?Integer flags) → [ Integer, Process::Status ]
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1326
def self.wait2: (?Integer pid, ?Integer flags) -> [ Integer, Process::Status ]
Like Process.waitpid, but returns an array containing the child process pid and Process::Status status:
pid = Process.spawn('ruby', '-e', 'exit 13') # => 309581 Process.wait2(pid) # => [309581, #<Process::Status: pid 309581 exit 13>]
Process.waitpid2 is an alias for Process.wait2.
() → ::Array[[ Integer, Process::Status ]]
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1341
def self.waitall: () -> ::Array[[ Integer, Process::Status ]]
Waits for all children, returns an array of 2-element arrays; each subarray contains the integer pid and Process::Status status for one of the reaped child processes:
pid0 = Process.spawn('ruby', '-e', 'exit 13') # => 325470 pid1 = Process.spawn('ruby', '-e', 'exit 14') # => 325495 Process.waitall # => [[325470, #<Process::Status: pid 325470 exit 13>], [325495, #<Process::Status: pid 325495 exit 14>]]
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1477
def self.waitpid: (?Integer pid, ?Integer flags) -> Integer
Waits for a suitable child process to exit, returns its process ID, and sets $? to a Process::Status object containing information on that process. Which child it waits for depends on the value of the given pid:
-
Positive integer: Waits for the child process whose process ID is
pid:pid0 = Process.spawn('ruby', '-e', 'exit 13') # => 230866 pid1 = Process.spawn('ruby', '-e', 'exit 14') # => 230891 Process.wait(pid0) # => 230866 $? # => #<Process::Status: pid 230866 exit 13> Process.wait(pid1) # => 230891 $? # => #<Process::Status: pid 230891 exit 14> Process.wait(pid0) # Raises Errno::ECHILD
-
0: Waits for any child process whose group ID is the same as that of the current process:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." end retrieved_pid = Process.wait(0) puts "Process.wait(0) returned pid #{retrieved_pid}, which is child 0 pid." begin Process.wait(0) rescue Errno::ECHILD => x puts "Raised #{x.class}, because child 1 process group ID differs from parent process group ID." end
Output:
Parent process group ID is 225764. Child 0 pid is 225788 Child 0 process group ID is 225764 (same as parent's). Child 1 pid is 225789 Child 1 process group ID is 225789 (different from parent's). Process.wait(0) returned pid 225788, which is child 0 pid. Raised Errno::ECHILD, because child 1 process group ID differs from parent process group ID.
-
-1(default): Waits for any child process:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." sleep 3 # To force child 1 to exit later than child 0 exit. end child_pids = [child0_pid, child1_pid] retrieved_pid = Process.wait(-1) puts child_pids.include?(retrieved_pid) retrieved_pid = Process.wait(-1) puts child_pids.include?(retrieved_pid)
Output:
Parent process group ID is 228736. Child 0 pid is 228758 Child 0 process group ID is 228736 (same as parent's). Child 1 pid is 228759 Child 1 process group ID is 228759 (different from parent's). true true
-
Less than
-1: Waits for any child whose process group ID is-pid:parent_pgpid = Process.getpgid(Process.pid) puts "Parent process group ID is #{parent_pgpid}." child0_pid = fork do puts "Child 0 pid is #{Process.pid}" child0_pgid = Process.getpgid(Process.pid) puts "Child 0 process group ID is #{child0_pgid} (same as parent's)." end child1_pid = fork do puts "Child 1 pid is #{Process.pid}" Process.setpgid(0, Process.pid) child1_pgid = Process.getpgid(Process.pid) puts "Child 1 process group ID is #{child1_pgid} (different from parent's)." end sleep 1 retrieved_pid = Process.wait(-child1_pid) puts "Process.wait(-child1_pid) returned pid #{retrieved_pid}, which is child 1 pid." begin Process.wait(-child1_pid) rescue Errno::ECHILD => x puts "Raised #{x.class}, because there's no longer a child with process group id #{child1_pid}." end
Output:
Parent process group ID is 230083. Child 0 pid is 230108 Child 0 process group ID is 230083 (same as parent's). Child 1 pid is 230109 Child 1 process group ID is 230109 (different from parent's). Process.wait(-child1_pid) returned pid 230109, which is child 1 pid. Raised Errno::ECHILD, because there's no longer a child with process group id 230109.
Argument flags should be given as one of the following constants, or as the logical OR of both:
-
Process::WNOHANG: Does not block if no child process is available.
-
Process::WUNTRACED: May return a stopped child process, even if not yet reported.
Not all flags are available on all platforms.
Raises Errno::ECHILD if there is no suitable child process.
Not available on all platforms.
Process.waitpid is an alias for Process.wait.
(?Integer pid, ?Integer flags) → [ Integer, Process::Status ]
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1492
def self.waitpid2: (?Integer pid, ?Integer flags) -> [ Integer, Process::Status ]
Like Process.waitpid, but returns an array containing the child process pid and Process::Status status:
pid = Process.spawn('ruby', '-e', 'exit 13') # => 309581 Process.wait2(pid) # => [309581, #<Process::Status: pid 309581 exit 13>]
Process.waitpid2 is an alias for Process.wait2.
() → bool
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/core/process.rbs, line 1520
def self.warmup: () -> bool
Notify the Ruby virtual machine that the boot sequence is finished, and that now is a good time to optimize the application. This is useful for long running applications.
This method is expected to be called at the end of the application boot. If the application is deployed using a pre-forking model, Process.warmup should be called in the original process before the first fork.
The actual optimizations performed are entirely implementation specific and may change in the future without notice.
On CRuby, Process.warmup:
-
Performs a major
GC. -
Compacts the heap.
-
Promotes all surviving objects to the old generation.
-
Precomputes the coderange of all strings.
-
Frees all empty heap pages and increments the allocatable pages counter by the number of pages freed.
-
Invoke
malloc_trimif available to free empty malloc pages.