어린이에게 적용되는 Perl 스크립트 내부에서 Ulimit을 어떻게 설정합니까?
문제
회사를위한 개발 상자를 설정하기 위해 다양한 설치 단계를 수행하는 PERL 스크립트가 있습니다. 다양한 쉘 스크립트를 실행하며 그 중 일부는 필요한 것보다 낮아서 충돌합니다. ulimit
S (특히 스택 크기 -s
나의 경우에는).
따라서 a를 설정하고 싶습니다 ulimit
모든 스크립트에 적용됩니다 (children
)는 내 주요 Perl One에서 시작했지만 그 방법을 달성하는 방법을 잘 모르겠습니다. 스크립트 내에서 Ulimit을 호출하려는 시도는 특정 하위 쉘에만 설정하여 즉시 종료됩니다.
나는 내가 전화 할 수 있다는 것을 알고있다 ulimit
Perl 스크립트 또는 사용을 실행하기 전에 /etc/security/limits.conf
그러나 나는 사용자가 이것을 알고 싶지 않습니다. 그들은 스크립트를 실행하는 방법 만 알아야합니다.
나도 달릴 수 있습니다 ulimit
이와 같은 명령을 실행할 때마다 ulimit -s BLA; ./cmd
그러나 나는 매번 이것을 복제하고 싶지 않으며 더 깨끗하고 깨끗한 솔루션이있는 것 같습니다.
또 다른 미친 "해결 방법"은 bla.sh라는 래퍼 스크립트를 만드는 것입니다. Bla.sh는 ulimit을 설정하고 bla.pl을 호출 할 것입니다. 그러나 다시, 그것은 내 마음에 해킹이며 이제 2 개의 스크립트를 가질 것입니다 (Bla.pl을 만들 수도 있습니다. "ulimit -s bla; ./bla.pl - -foo"와 함께 전화를 걸고 -foo를 보는지 여부에 따라 다르게 행동하지만 이전보다 훨씬 해킹됩니다).
마지막으로 BSD :: Resource를 설치할 수는 있지만 외부 종속성을 사용하지 않으려 고합니다.
그래서 무엇입니까 그만큼 Perl 스크립트 내에서 Ulimit을 설정하고 모든 어린이에게 적용하는 방법?
고맙습니다.
해결책 4
나는 결국 선불로 끝났다 ulimit -s BLA
필요한 명령에. BSD :: Resource는 기본 Perl 패키지가 아니고 기존 개발자 기계의 약 절반에 누락 되었기 때문에 BSD :: Resource를 사용하고 싶지 않았습니다. 사용자 상호 작용은 특정 요구 사항이 아닙니다.
다른 팁
당신은 이미 당신의 질문에 대답했습니다 : 사용 BSD :: 자원.
Perl 코어에는 다음과 인터페이스하는 것이 없습니다. setrlimit
. 표준 방법을 사용할 수 없거나 사용하지 않으면 해킹을 사용해야합니다. 이미 설명한 방법은 작동합니다. (Prepend Subroutine을 만들 수 있습니다. ulimit -s BLA;
모든 명령에, 그리고 대신 해당 하위를 사용하십시오. system
.)
당신은 항상 작은 쉘 스크립트로 perl을 감을 수 있습니다.
#!/bin/sh -- # --*-Perl-*--
ulimit -n 2048
exec /usr/bin/perl -x -S $0 ${1+"$@"}
#!/usr/bin/perl
#line 6
use strict;
# etc, etc....
추악하고 분명히 스크립트 시작 시간이 약간 길어질 것입니다.
다음은 BSD :: Resource를 사용하지 않고 CPU 제한을 설정하는 방법의 예입니다 (그러나 PERL 시스템 헤더가 있다고 가정). 다른 리소스에 적응하려면 명백한 변경을 수행하십시오.
require 'syscall.ph';
require 'sys/resource.ph';
# set the soft cpu limit to 1 (second), and the hard limit to 10.
$rstruct = pack "L!L!",1,10; # L! means native long unsigned int.
syscall(&SYS_setrlimit,&RLIMIT_CPU,$rstruct);
이것은 RLIM_T가 실제로 서명되지 않았다는 지식을 가정합니다. Perl 헤더 에서이 정보를 추출 할 수있는 방법이 있는지 모르겠습니다.