¿Cómo ajustar un comando para que aparezca como ejecutable un script en lugar de su hijo?

¿Cómo ajustar un comando para que aparezca como ejecutable un script en lugar de su hijo?

Envolví mi script R /usr/lib/R/bin/exec/Rpara limitar el uso de memoria: le cambié el nombre /usr/lib/R/bin/exec/R_origy luego creé un script bash llamado /usr/lib/R/bin/exec/Rcon 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/Rsea visto como ejecutable en sí mismo, de modo que, por ejemplo, topno muestre un proceso secundario separado R_orig, sino sólo el proceso R?

Respuesta1

No hagas eso. Al reemplazar el original Rpor 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 Rejecutable original como estaba. No coloque este script /usr/lib/R/bin/execsino 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 ( ~/.bashrcpara 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 "$@"

información relacionada