Beachten Sie dies aus der Dokumentation von Bash 'builtin exec:
exec ersetzt die Shell, ohne einen neuen Prozess zu erstellen
Bitte geben Sie einen Anwendungsfall / ein praktisches Beispiel an. Ich verstehe nicht, wie das Sinn macht.
Ich habe gegoogelt und etwas über die E / A-Umleitung herausgefunden . Kannst du es besser erklären?
bash
shell-script
exec
shell-builtin
Ivanov
quelle
quelle
Antworten:
exec
wird häufig in Shell-Skripten verwendet, die hauptsächlich als Wrapper zum Starten anderer Binärdateien dienen. Beispielsweise:Nach Beendigung der Ausführung des Wrappers übernimmt die "echte" Binärdatei und es ist keine Spur des Wrapperskripts mehr vorhanden, die vorübergehend denselben Steckplatz in der Prozesstabelle belegt hat. Die "echte" Binärdatei ist ein direktes Kind dessen, was sie anstelle eines Enkelkindes gestartet hat.
Sie erwähnen in Ihrer Frage auch die E / A-Umleitung. Das ist ein ganz anderer Anwendungsfall
exec
und hat nichts damit zu tun, die Shell durch einen anderen Prozess zu ersetzen. Wannexec
hat keine Argumente, wie so:Die E / A-Umleitungen in der Befehlszeile werden im aktuellen Shell-Prozess wirksam, der aktuelle Shell-Prozess wird jedoch weiterhin ausgeführt und fährt mit dem nächsten Befehl im Skript fort.
quelle
exec
die Shell anweist, die Aktion nicht in einem untergeordneten Prozess, sondern in demselben Prozess auszuführen (einen Befehl auszuführen oder eine Umleitung auszuführen).Ich habe eine
exec
eingebaute Shell verwendet, um eine Prozess-ID (PID) für ein Java-Programm zu erhalten. Möglicherweise gibt es jetzt eine Möglichkeit, PID aus Java heraus abzurufen, vor einigen Jahren jedoch noch nicht. Sobald ein Prozess eine eigene PID hat, kann er diese in eine PID-Datei schreiben (nach/var/run/
Dateinamen mit dem Suffix '.pid' suchen), damit Verwaltungsprogramme die PID des ausgeführten Prozesses kennen und eine zweite Instanz verhindern können desselben Servers vom Laufen. Es funktioniert ungefähr so:Code in der
main()
Methode der KlasseStartClass
verarbeitet das Parsen von Argumenten und kann seine eigene Prozess-ID finden.quelle
Führen Sie zum Spaß das folgende Programm (übersetzt in die Implementierungssprache Ihrer Wahl) im Hintergrund auf einem System mit Benutzerprozessabrechnung und Grenzwerten aus.
Nun, da jeder Slot in der Prozesstabelle, den Sie verwenden dürfen, voll mit Kopien dieses laufenden Programms ist, wie beabsichtigen Sie, es zu töten? Das Starten von kill (1) erfordert einen anderen Prozess-Slot, den Sie nicht haben können. Es wäre sicher praktisch, wenn die Shell sich selbst durch den Befehl kill ersetzen würde ...
(Angenommen, Ihr System hat kill (1) unter / bin / kill. "Exec` which kill` -9 -1 "ist möglicherweise sicherer.) Dies sendet SIGKILL an jeden Prozess, den Sie können.
(Hinweis: Melden Sie sich nicht von Ihrer Startshell ab, es sei denn, die Prozessbeschränkungen erlauben immer ein erneutes Anmelden eines Prozessfensters für die Shell. Dies kann etwas schwieriger zu bereinigen sein, wenn Sie dies tun Anfang der 90er Jahre.
quelle
exec
Befehl zeigen würden, der in dieser Situation nützlich wäre. (2) Diese Antwort ist etwas archaisch; Daskill
Kommando ist seit vielen Jahren ein eingebautes Kommando in Bash, hauptsächlich wegen dieser Besorgnis.exec
- und die Tatsache, dasskill
es sich um ein eingebautes System handelt, hat nichts mit demexec
eingebauten System zu tun .`which kill`
ist, funktioniert die Befehlsersetzung (z. B. ) ebenfalls nicht. (2) Übrigens wird das$(…)
Formular über dem`…`
Formular empfohlen . (3) Das Erraten des Verzeichnisses ist jedoch ungefährlich. Wenn Sie versehentlich tippenexec /binn/kill
, erhalten Sie einfach eine Fehlermeldung und Ihre Shell verschwindet nicht. (4) Aber Sie müssen sich nicht einmal Gedanken darüber machen, in welchem Verzeichniskill
.exec
Verwendet wird$PATH
, genau wie bei normalen Befehlen. Funktioniert alsoexec kill …
(vorausgesetzt, Sie haben/bin
in Ihrem Suchpfad).Dies ähnelt dem Beispiel von Bruce, bei dem die PID eines Prozesses ermittelt werden muss:
in dem du
(
und)
),$$
Gibt die PID der Haupt-Shell an.)Dies wird ausgeführt
long-running-command
, jedoch nur für eine vorher festgelegte, begrenzte Zeitdauer.Dies ist ein wenig frivol, aber wenn Sie sich entscheiden, für den Rest Ihrer Anmeldesitzung root (oder ein anderer Benutzer) zu sein, können Sie dies tun
exec su
.Eigentlich kann ich mir ein Szenario vorstellen, in dem dies wirklich nützlich wäre. Angenommen, Sie sind bei einem Remote-System angemeldet und aus irgendeinem Grund besteht ein Problem beim Unterbrechen der Verbindung und beim Starten einer neuen Verbindung. Angenommen, das ferne System verfügt über eine Firewall, die einem Zeitplan folgt. Sie durften sich verbinden, als Sie dies taten, und bestehende Verbindungen werden nicht geschlossen, aber zum gegenwärtigen Zeitpunkt werden neue Verbindungen nicht akzeptiert.
Sie haben getan, was Sie tun wollten, und können sich abmelden. Ihr Freund Bob ist mit Ihnen im Raum und möchte etwas am Remote-System arbeiten - aber er kann keine Verbindung herstellen. Sie geben also ein
exec su - bob
und übergeben die Workstation an ihn, wenn die Kennwortabfrage angezeigt wird. Es gibt jetzt keinen Prozess mit Ihrer UID (es sei denn, Sie haben etwas im Hintergrund ausgeführt), sodass Bob nicht in der Lage ist, mit Ihren Dateien herumzuspielen. Er wird Ihre Verbindung effektiv übernommen haben (mit Ihrer Zustimmung und Kooperation).Anmerkungen:
su
.who
wird wahrscheinlich immer noch Ihr Name angezeigt. Es ist vorstellbar, dass ein (schlecht geschriebenes) Programm das verwendet, um zu glauben, dass Bob Sie sind, und ihm Zugriff auf Ihre Ressourcen zu gewähren.quelle
(a;b)
bereits das gleiche gilt wie(a;exec b)
in Shells, um die Verzweigung für den letzten Befehl in einer Subshell zu optimieren. Die einzigen Ausnahmen zu sein scheinen ,bash
undmksh
. Verwendungexec
hilft, um es zu garantieren.