modul Verarbeiten

Modul Verarbeiten repräsentiert einen Prozess im zugrundeliegenden Betriebssystem. Seine Methoden unterstützen die Verwaltung des aktuellen Prozesses und seiner Kindprozesse.

Prozess-Erzeugung

Jede der folgenden Methoden führt einen gegebenen Befehl in einem neuen Prozess oder einer neuen Subshell aus, oder mehrere Befehle in neuen Prozessen und/oder Subshells. Die Wahl des Prozesses oder der Subshell hängt von der Form des Befehls ab; siehe Argument command_line oder exe_path.

Zusätzlich

Ausführungsumgebung

Optionales führendes Argument env ist ein Hash von Name/Wert-Paaren, wobei jeder Name ein String und jeder Wert ein String oder nil ist; jedes Name/Wert-Paar wird zu ENV im neuen Prozess hinzugefügt.

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

Ausgabe

"0"

Die Auswirkung ist normalerweise ähnlich wie das Aufrufen von ENV#update mit dem Argument env, wobei jede benannte Umgebungsvariable erstellt oder aktualisiert (wenn der Wert nicht nil ist) oder gelöscht wird (wenn der Wert nil ist).

Einige Änderungen am aufrufenden Prozess können jedoch bestehen bleiben, wenn der neue Prozess fehlschlägt. Zum Beispiel werden harte Ressourcenlimits nicht wiederhergestellt.

Argument command_line oder exe_path

Das erforderliche String-Argument ist eines der folgenden

Argument command_line

Das Zeichenkettenargument command_line ist eine Befehlszeile, die an eine Shell übergeben wird; sie muss mit einem reservierten Shell-Wort beginnen, mit einem speziellen Built-in beginnen oder Metazeichen enthalten.

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.

Die Befehlszeile kann auch Argumente und Optionen für den Befehl enthalten.

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

Ausgabe

Foo

Siehe Ausführungs-Shell für Details zur Shell.

Argument exe_path

Das Argument exe_path ist eines der folgenden:

Argumente args

Wenn command_line keine Shell-Meta-Zeichen außer Leerzeichen und Tabs enthält oder exe_path angegeben ist, ruft Ruby die ausführbare Datei direkt auf. Diese Form verwendet keine 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

Die Fehlermeldung stammt von einer Shell und variiert je nach System.

Wenn nach exe_path ein oder mehrere args angegeben sind, ist jedes davon ein Argument oder eine Option, die an die ausführbare Datei übergeben werden soll.

Beispiel

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

Ausgabe

< C* | $SHELL >

Es gibt jedoch Ausnahmen unter Windows. Siehe Ausführungs-Shell unter Windows.

Wenn Sie einen Pfad mit Leerzeichen ohne Argumente ohne Shell aufrufen möchten, müssen Sie ein 2-Element-Array exe_path verwenden.

Beispiel

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

Ausführungsoptionen

Optionales nachgestelltes Argument options ist ein Hash von Ausführungsoptionen.

Arbeitsverzeichnis (:chdir)

Standardmäßig ist das Arbeitsverzeichnis für den neuen Prozess dasselbe wie das des aktuellen Prozesses.

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

Ausgabe

/var

Verwenden Sie die Option :chdir, um das Arbeitsverzeichnis für den neuen Prozess festzulegen.

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

Ausgabe

/tmp

Das Arbeitsverzeichnis des aktuellen Prozesses wird nicht geändert.

Dir.pwd # => "/var"

Datei-Umleitung (Dateideskriptor)

Verwenden Sie Ausführungsoptionen für die Datei-Umleitung im neuen Prozess.

Der Schlüssel für eine solche Option kann ein Integer-Dateideskriptor (fd) sein, der eine Quelle angibt, oder ein Array von fds, das mehrere Quellen angibt.

Eine Integer-Quellen-fd kann wie folgt angegeben werden

Es gibt diese Kurzsymbole für fds

Der mit einer Quelle angegebene Wert ist einer der folgenden

Siehe Zugriffsmodi und Datei-Berechtigungen.

Umgebungsvariablen (:unsetenv_others)

Standardmäßig erbt der neue Prozess Umgebungsvariablen vom Elternprozess; verwenden Sie den Ausführungsoptionsschlüssel :unsetenv_others mit dem Wert true, um Umgebungsvariablen im neuen Prozess zu löschen.

Alle durch die Ausführungsoption env spezifizierten Änderungen werden vorgenommen, nachdem der neue Prozess seine Umgebungsvariablen geerbt oder gelöscht hat; siehe Ausführungsumgebung.

Datei-Erstellungszugriff (:umask)

Verwenden Sie die Ausführungsoption :umask, um den Datei-Erstellungszugriff für den neuen Prozess festzulegen; siehe Zugriffsmodi.

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

Ausgabe

0644

Prozessgruppen (:pgroup und :new_pgroup)

Standardmäßig gehört der neue Prozess zu derselben Prozessgruppe wie der Elternprozess.

Um eine andere Prozessgruppe anzugeben, verwenden Sie die Ausführungsoption :pgroup mit einem der folgenden Werte

Nur unter Windows, verwenden Sie die Ausführungsoption :new_pgroup mit dem Wert true, um eine neue Prozessgruppe für den neuen Prozess zu erstellen.

Ressourcenlimits

Verwenden Sie Ausführungsoptionen, um Ressourcenlimits festzulegen.

Die Schlüssel für diese Optionen sind Symbole der Form :rlimit_resource_name, wobei resource_name die kleingeschriebene Form eines der String-Ressourcennamen ist, die unter der Methode Process.setrlimit beschrieben werden. Zum Beispiel entspricht der Schlüssel :rlimit_cpu dem Ressourcenlimit 'CPU'.

Der Wert für einen solchen Schlüssel ist einer der folgenden

Dateideskriptor-Vererbung

Standardmäßig erbt der neue Prozess Dateideskriptoren vom Elternprozess.

Verwenden Sie die Ausführungsoption :close_others => true, um diese Vererbung zu ändern, indem Sie nicht standardmäßige fds (3 und höher), die nicht anderweitig umgeleitet werden, schließen.

Ausführungs-Shell

Unter einem Unix-ähnlichen System ist die aufgerufene Shell /bin/sh; der gesamte String command_line wird als Argument an die Shell-Option -c übergeben.

Die Shell führt die normale Shell-Expansion für die Befehlszeile durch.

Beispiel

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

Ausgabe

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

Ausführungs-Shell unter Windows

Unter Windows wird die aufgerufene Shell durch die Umgebungsvariable RUBYSHELL bestimmt, falls definiert, oder andernfalls COMSPEC; der gesamte String command_line wird als Argument an die Option -c für RUBYSHELL sowie an /bin/sh und die Option /c für COMSPEC übergeben. Die Shell wird in den folgenden Fällen automatisch aufgerufen

Beachten Sie, dass der Befehl immer noch im command_line-Format aufgerufen wird, auch wenn er im exe_path-Format aufgerufen wird, da cmd.exe kein Skript mit Namen wie /bin/sh akzeptiert, sondern nur mit der Option /c arbeitet.

Die Standard-Shell cmd.exe führt eine Umgebungsvariablen-Erweiterung durch, verfügt aber nicht über die Globbing-Funktionalität.

Beispiel

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

Ausgabe

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

Was gibt es hier

Aktueller-Prozess-Getter

Aktueller-Prozess-Setter

Aktueller-Prozess-Ausführung

Kindprozesse

Prozessgruppen

Timing