
/usr/lib/R/bin/exec/R
Um die Speichernutzung zu begrenzen, habe ich mein R-Skript verpackt : Ich habe es umbenannt /usr/lib/R/bin/exec/R_orig
und dann ein Bash-Skript /usr/lib/R/bin/exec/R
mit 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/R
als eigenständige ausführbare Datei anzuzeigen, sodass beispielsweise top
kein separater untergeordneter Prozess R_orig
, sondern nur der Prozess selbst angezeigt wird R
?
Antwort1
Tun Sie das nicht. Wenn Sie das Original R
durch 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 R
ausführbare Datei unverändert. Platzieren Sie dieses Skript nicht in, /usr/lib/R/bin/exec
sondern 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 ( ~/.bashrc
fü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 "$@"