Nếu bạn có một trường hợp phức tạp hơn trường hợp phổ biến không thể xử lý được ``
, thì hãy kiểm tra Kernel.spawn()
. Đây dường như là tính năng chung / đầy đủ nhất được cung cấp bởi stock Ruby để thực thi các lệnh bên ngoài.
Bạn có thể sử dụng nó để:
- tạo các nhóm quy trình (Windows).
- chuyển hướng vào, ra, lỗi với các tập tin / nhau.
- đặt env vars, umask.
- thay đổi thư mục trước khi thực hiện một lệnh.
- đặt giới hạn tài nguyên cho CPU / dữ liệu / vv.
- Làm mọi thứ có thể được thực hiện với các tùy chọn khác trong các câu trả lời khác, nhưng với nhiều mã hơn.
Các tài liệu của Ruby có các ví dụ tốt, đủ:
env: hash
name => val : set the environment variable
name => nil : unset the environment variable
command...:
commandline : command line string which is passed to the standard shell
cmdname, arg1, ... : command name and one or more arguments (no shell)
[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell)
options: hash
clearing environment variables:
:unsetenv_others => true : clear environment variables except specified by env
:unsetenv_others => false : dont clear (default)
process group:
:pgroup => true or 0 : make a new process group
:pgroup => pgid : join to specified process group
:pgroup => nil : dont change the process group (default)
create new process group: Windows only
:new_pgroup => true : the new process is the root process of a new process group
:new_pgroup => false : dont create a new process group (default)
resource limit: resourcename is core, cpu, data, etc. See Process.setrlimit.
:rlimit_resourcename => limit
:rlimit_resourcename => [cur_limit, max_limit]
current directory:
:chdir => str
umask:
:umask => int
redirection:
key:
FD : single file descriptor in child process
[FD, FD, ...] : multiple file descriptor in child process
value:
FD : redirect to the file descriptor in parent process
string : redirect to file with open(string, "r" or "w")
[string] : redirect to file with open(string, File::RDONLY)
[string, open_mode] : redirect to file with open(string, open_mode, 0644)
[string, open_mode, perm] : redirect to file with open(string, open_mode, perm)
[:child, FD] : redirect to the redirected file descriptor
:close : close the file descriptor in child process
FD is one of follows
:in : the file descriptor 0 which is the standard input
:out : the file descriptor 1 which is the standard output
:err : the file descriptor 2 which is the standard error
integer : the file descriptor of specified the integer
io : the file descriptor specified as io.fileno
file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
:close_others => false : inherit fds (default for system and exec)
:close_others => true : dont inherit (default for spawn and IO.popen)