Wie umschließt man einen Befehl, sodass als ausführbare Datei ein Skript und nicht dessen untergeordnetes Element angezeigt wird?

Wie umschließt man einen Befehl, sodass als ausführbare Datei ein Skript und nicht dessen untergeordnetes Element angezeigt wird?

/usr/lib/R/bin/exec/RUm die Speichernutzung zu begrenzen, habe ich mein R-Skript verpackt : Ich habe es umbenannt /usr/lib/R/bin/exec/R_origund dann ein Bash-Skript /usr/lib/R/bin/exec/Rmit folgendem Inhalt erstellt:

#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"

Dies stellt eine enorme Verbesserung gegenüber meiner Erfahrung mit diesem speziellen Programm dar, ich habe jedoch festgestellt, dass einige Teile davon tatsächlich den Namen der ausführbaren Datei verwenden, um Paketinstallationspfade zu bestimmen, und da der Name der ausführbaren Datei geändert wird, schlagen diese fehl.

Ist es möglich, mein Skript /usr/lib/R/bin/exec/Rals eigenständige ausführbare Datei anzuzeigen, sodass beispielsweise topkein separater untergeordneter Prozess R_orig, sondern nur der Prozess selbst angezeigt wird R?

Antwort1

Tun Sie das nicht. Wenn Sie das Original Rdurch etwas ersetzen, das eine Zeichenfolge auf der Standardausgabe ausgibt, verwirren Sie möglicherweise Anwendungen, die die Ausgabe analysieren.

Erstellen Sie stattdessen das Wrapper-Skript unter einem neuen Namen und lassen Sie die ursprüngliche Rausführbare Datei unverändert. Platzieren Sie dieses Skript nicht in, /usr/lib/R/bin/execsondern an einem Ort wie /usr/local/bin(falls es für alle Benutzer zugänglich sein muss). Dadurch werden spätere Paketaktualisierungen oder Deinstallationsskripte nicht durcheinander gebracht.

Sie können alternativ eine Shell-Funktion in Ihren Shell-Startdateien definieren:

myR () (
    echo "Memory limited to 10G"
    ulimit -Sv 10000000 #limit memory for 64-bit version
    exec /usr/lib/R/bin/exec/R "$@"
)

Eine weitere naheliegende Möglichkeit wäre, das Limit in Ihren Shell-Initialisierungsskripten festzulegen ( ~/.bashrcfür bash). Das Limit wird auf alle von der Shell gestarteten Prozesse übertragen.

Antwort2

Um Ihre Frage hoffentlich zu beantworten, ändern Sie die letzte Zeile Ihres Skripts in

exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

Dadurch wird der aktuelle Prozess (die Shell, die das Skript ausführt) durch das Programm R_orig ersetzt, anstatt R_orig als untergeordnetes Element des Skripts auszuführen. Außerdem wird der Name des Programms, das traditionelle erste Argument, als Originalname übergeben. Die meisten Programme, die nach Paketinstallationen suchen, verwenden diesen ersten Namen.

Ich stimme mit @Kusalananda überein, dass es keine gute Idee ist, die Meldung „Speicher auf 10 G begrenzt“ auszugeben. Wenn Sie dies tun möchten, geben Sie es an stderr aus. Das bedeutet, dass Ihr Skript so aussehen sollte.

#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"

verwandte Informationen