module Process

Module 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 上,使用执行选项 :new_pgroup 并将值设置为 true,为新进程创建一个新的进程组。

资源限制

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

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

此类键的值是以下之一

文件描述符继承

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

使用执行选项 :close_others => true 来修改继承,通过关闭未被重定向的标准文件描述符(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*

这里有什么

当前进程的 Getters

当前进程的 Setters

当前进程执行

子进程

进程组

计时