
Envolví mi script R /usr/lib/R/bin/exec/R
para limitar el uso de memoria: le cambié el nombre /usr/lib/R/bin/exec/R_orig
y luego creé un script bash llamado /usr/lib/R/bin/exec/R
con el contenido:
#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"
Esta es una gran mejora en mi experiencia con ese programa en particular, pero descubrí que algunas partes en realidad usan el nombre del ejecutable para determinar las rutas de instalación del paquete y, dado que el nombre del ejecutable se modifica, fallan.
¿Es posible hacer que mi script /usr/lib/R/bin/exec/R
sea visto como ejecutable en sí mismo, de modo que, por ejemplo, top
no muestre un proceso secundario separado R_orig
, sino sólo el proceso R
?
Respuesta1
No hagas eso. Al reemplazar el original R
por algo que genera una cadena en la salida estándar, es posible que confundas las aplicaciones que pueden analizar su salida.
En su lugar, cree el script contenedor con un nombre nuevo y deje el R
ejecutable original como estaba. No coloque este script /usr/lib/R/bin/exec
sino en algún lugar similar /usr/local/bin
(si es que es necesario que todos los usuarios puedan acceder a él). Además, esto no confundirá las actualizaciones de paquetes posteriores ni los scripts de desinstalación.
Alternativamente, puede definir una función de shell en sus archivos de inicio de shell:
myR () (
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
exec /usr/lib/R/bin/exec/R "$@"
)
Otra opción obvia sería establecer el límite en los scripts de inicialización de Shell ( ~/.bashrc
para bash
). El límite se trasladará a cualquier proceso iniciado desde el shell.
Respuesta2
Para responder con suerte a su pregunta, cambie la línea final de su guión a
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"
Esto reemplazará el proceso actual (el shell que ejecuta el script) con el programa R_orig en lugar de ejecutar R_orig como hijo del script. Además pasará el nombre del programa, el primer argumento tradicional como nombre original. La mayoría de los programas que buscan la instalación de paquetes utilizarán este nombre.
Estoy de acuerdo con @Kusalananda en que es una mala idea mostrar el mensaje "Memoria limitada a 10G". Si desea hacer esto, envíelo a stderr. Esto significa que su script debería verse así.
#!/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 "$@"