메모리 사용량을 제한하기 위해 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 "$@"
)
또 다른 확실한 선택은 쉘 초기화 스크립트에서 한계( ~/.bashrc
for )를 설정하는 것입니다 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 "$@"