스크립트가 아래 첨자 대신 실행 가능한 것으로 나타나도록 명령을 래핑하려면 어떻게 해야 합니까?

스크립트가 아래 첨자 대신 실행 가능한 것으로 나타나도록 명령을 래핑하려면 어떻게 해야 합니까?

메모리 사용량을 제한하기 위해 R 스크립트를 래핑했습니다 /usr/lib/R/bin/exec/R. 이름을 변경한 /usr/lib/R/bin/exec/R_orig다음 /usr/lib/R/bin/exec/R콘텐츠 이름을 따서 bash 스크립트를 만들었습니다.

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

이것은 이 특정 프로그램에 대한 내 경험에서 큰 개선이었지만, 그 중 일부는 실제로 패키지 설치 경로를 결정하기 위해 실행 파일 이름을 사용했고, 실행 파일 이름이 수정되었기 때문에 실패했다는 것을 발견했습니다.

/usr/lib/R/bin/exec/R내 스크립트 자체를 실행 파일로 간주할 수 있습니까 ? 예를 들어 top개별 하위 프로세스를 표시하지 않고 R_orig프로세스만 표시합니까 R?

답변1

그러지 마세요. 원본 콘텐츠를 문자열을 표준 출력으로 출력하는 콘텐츠로 바꾸면 R출력을 구문 분석할 수 있는 애플리케이션을 혼동할 수 있습니다.

대신 새 이름으로 래퍼 스크립트를 만들고 원래 R실행 파일을 변경하지 않은 상태로 두세요. 이 스크립트를 /usr/lib/R/bin/exec비슷한 위치 에 두지 마십시오 /usr/local/bin(모든 사용자가 액세스해야 하는 경우). 이는 또한 향후 패키지 업그레이드 또는 제거 스크립트를 혼동하지 않습니다.

셸 시작 파일에서 셸 함수를 정의할 수도 있습니다.

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

또 다른 확실한 선택은 쉘 초기화 스크립트에서 한계( ~/.bashrcfor )를 설정하는 것입니다 bash. 이 제한은 셸에서 시작된 모든 프로세스에 적용됩니다.

답변2

귀하의 질문에 대한 답변을 얻으려면 스크립트의 마지막 줄을 다음으로 변경하십시오.

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

이는 R_orig를 스크립트의 하위 프로세스로 실행하는 대신 현재 프로세스(스크립트를 실행하는 셸)를 R_orig 프로그램으로 대체합니다. 또한 기존의 첫 번째 인수인 프로그램 이름을 원래 이름으로 전달합니다. 설치된 패키지를 찾는 대부분의 프로그램은 이 이름을 사용합니다.

나는 "메모리 제한은 10G입니다"라는 메시지를 출력하는 것은 나쁜 생각이라는 @Kusalananda의 의견에 동의합니다. 정말로 이 작업을 수행하려면 stderr로 출력하십시오. 이는 스크립트가 다음과 같아야 함을 의미합니다.

#!/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 "$@"

관련 정보