
메모리 사용량을 제한하기 위해 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 "$@"