模块 Process

模块 Process 代表底层操作系统中的一个进程。其方法支持管理当前进程及其子进程。

进程创建

以下每个方法都会在新进程或子 shell 中执行给定的命令,或者在新进程和/或子 shell 中执行多个命令。进程或子 shell 的选择取决于命令的形式;请参阅 参数 command_line 或 exe_path

此外

执行环境

可选的前导参数 env 是一个名称/值对的哈希,其中每个名称都是一个字符串,每个值都是一个字符串或 nil;每个名称/值对都会添加到新进程的 ENV 中。

Process.spawn(                'ruby -e "p ENV[\"Foo\"]"')
Process.spawn({'Foo' => '0'}, 'ruby -e "p ENV[\"Foo\"]"')

输出

"0"

其效果通常类似于使用参数 env 调用 ENV#update,其中每个命名环境变量都会被创建或更新(如果值不是 nil),或者被删除(如果值为 nil)。

但是,如果新进程失败,则对调用进程的一些修改可能会保留。例如,不会恢复硬资源限制。

参数 command_lineexe_path

所需的字符串参数是以下之一

参数 command_line

字符串参数 command_line 是要传递给 shell 的命令行;它必须以 shell 保留字开头,以特殊内置字开头,或者包含元字符

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.

命令行还可以包含命令的参数和选项

system('echo "Foo"') # => true

输出

Foo

有关 shell 的详细信息,请参阅 执行 Shell

参数 exe_path

参数 exe_path 是以下之一

参数 args

如果 command_line 不包含空格和制表符之外的 shell 元字符,或者给出了 exe_path,则 Ruby 会直接调用可执行文件。此形式不使用 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

错误消息来自 shell,并且会因您的系统而异。

如果在 exe_path 之后给出一个或多个 args,则每个参数都是要传递给可执行文件的参数或选项

示例

system('echo', '<', 'C*', '|', '$SHELL', '>')   # => true

输出

< C* | $SHELL >

但是,在 Windows 上有一些例外。请参阅 Windows 上的执行 Shell

如果您想调用不带 shell 的包含空格的路径,您将需要使用一个 2 元素数组 exe_path

示例

path = '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
spawn(path) # Raises Errno::ENOENT; No such file or directory - /Applications/Google
spawn([path] * 2)

执行选项

可选的尾随参数 options 是执行选项的哈希。

工作目录 (:chdir)

默认情况下,新进程的工作目录与当前进程的工作目录相同

Dir.chdir('/var')
Process.spawn('ruby -e "puts Dir.pwd"')

输出

/var

使用选项 :chdir 设置新进程的工作目录

Process.spawn('ruby -e "puts Dir.pwd"', {chdir: '/tmp'})

输出

/tmp

当前进程的工作目录不会更改

Dir.pwd # => "/var"

文件重定向 (文件描述符)

使用执行选项在新进程中进行文件重定向。

此类选项的键可以是整数文件描述符 (fd),指定源,也可以是 fd 数组,指定多个源。

整数源 fd 可以指定为

以下是 fd 的简写符号

与源一起给出的值是以下之一

请参阅 访问模式文件权限

环境变量 (:unsetenv_others)

默认情况下,新进程从父进程继承环境变量;使用执行选项键 :unsetenv_others 和值 true 清除新进程中的环境变量。

执行选项 env 指定的任何更改都是在新进程继承或清除其环境变量之后进行的;请参阅 执行环境

文件创建权限 (:umask)

使用执行选项 :umask 设置新进程的文件创建权限;请参阅 访问模式

command = 'ruby -e "puts sprintf(\"0%o\", File.umask)"'
options = {:umask => 0644}
Process.spawn(command, options)

输出

0644

进程组 (:pgroup:new_pgroup)

默认情况下,新进程与父进程属于同一个 进程组

要指定不同的进程组。使用以下值之一的执行选项 :pgroup

仅在 Windows 上,使用值为 true 的执行选项 :new_pgroup 为新进程创建一个新的进程组。

资源限制

使用执行选项设置资源限制。

这些选项的键是 :rlimit_resource_name 形式的符号,其中 resource_name 是方法 Process.setrlimit 中描述的字符串资源名称的小写形式。例如,键 :rlimit_cpu 对应于资源限制 'CPU'

此类键的值是以下之一

文件描述符继承

默认情况下,新进程从父进程继承文件描述符。

使用执行选项 :close_others => true 通过关闭未以其他方式重定向的非标准 fd(3 及更高版本)来修改该继承。

执行 Shell

在类 Unix 系统上,调用的 shell 是 /bin/sh;整个字符串 command_line 作为参数传递给 shell 选项 -c

shell 对命令行执行正常的 shell 扩展

示例

system('echo $SHELL: C*') # => true

输出

/bin/bash: CONTRIBUTING.md COPYING COPYING.ja

Windows 上的执行 Shell

在 Windows 上,调用的 shell 由环境变量 RUBYSHELL(如果已定义)或 COMSPEC(否则)确定;整个字符串 command_line 作为参数传递给 RUBYSHELL-c 选项,以及 /bin/sh,以及 COMSPEC/c 选项。在以下情况下,shell 会自动调用:

请注意,即使以 exe_path 形式调用,该命令仍将以 command_line 形式调用,因为 cmd.exe 不接受像 /bin/sh 这样的脚本名称,而只适用于 /c 选项。

标准 shell cmd.exe 执行环境变量扩展,但不具备 globbing 功能

示例

system("echo %COMSPEC%: C*")' # => true

输出

C:\WINDOWS\system32\cmd.exe: C*

本节内容

当前进程 Getter

当前进程 Setter

当前进程执行

子进程

进程组

计时