코어 덤프를 활성화하기 위해 대시 스크립트에서 한 줄의 posix dash 명령을 실행하는 방법은 무엇입니까?

코어 덤프를 활성화하기 위해 대시 스크립트에서 한 줄의 posix dash 명령을 실행하는 방법은 무엇입니까?

관련 없는 목적으로 인해 posix sh 에서만 작동하는 스크립트를 생성해야 합니다.

내 스크립트에서 시스템이 코어 덤프 생성을 허용하는지 확인한 다음 제한이 0으로 설정되면 스크립트를 실행하려고 합니다 ulimit -c unlimited.

나는 성공하지 못한 채 스크립트에서 이것을 시도했습니다.

  1. sh -c "ulimit -c unlimited"
  2. ulimit -c unlimited

내 일반 zsh 터미널에서 첫 번째 명령을 시도하면 실패하지만 sh를 실행하면 두 번째 명령이 수동으로 작동합니다.

그렇다면 더 큰 posix sh 스크립트 내에 배치하려면 이러한 명령을 어떻게 실행하여 코어 덤프를 활성화합니까?

답변1

ulimit실제로 정의되지 않음기준, 그것은 단지 아는 것 같기 ulimit -f때문에 표준이 어떤 문제를 피할 것이라고 기대할 수는 없습니다.

그러나 Bash, Dash(Debian ), Busybox, zsh, ksh 및 yash 등 ulimit -c unlimited제가 시도한 모든 셸에서 작동합니다 . /bin/shBSD의 ksh 변형에 대해 모르겠습니다.

설정된 리소스 제한은 ulimit프로세스에서 하위 프로세스로 상속되므로 스크립트의 설정은 스크립트에 의해 시작된 프로세스에만 영향을 미칩니다. 즉, 이는 sh -c "ulimit -c unlimited"쓸모가 없습니다. 제한을 설정한 후 즉시 종료되는 특정 셸에 대한 제한만 변경됩니다.

물론 제한 설정이 실패할 수도 있습니다. 예를 들어 하드 제한이 설정되어 제한을 올리지 못할 수도 있습니다. 따라서 ulimit통화에 대한 몇 가지 오류 검사를 수행 할 수 있습니다 .

if ! ulimit -c unlimited; then
    echo "error: something went wrong when setting core dump limit" >&2
    exit 1
fi
# do something here that might dump core

이는 대부분의 셸에서 작동하지만 zsh에서는 ulimit성공 상태가 항상 반환되고 실패하더라도 오류가 발생하지 않습니다(이상함). 따라서 zsh에서는 제한을 읽어 올바르게 설정되었는지 확인해야 합니다. 예를 들면 다음과 같습니다.

ulimit -c unlimited
if [ "$(ulimit -c)" != unlimited ]; then
    echo "error: core dump limit wasn't set" >&2
    exit 1
fi

물론 시스템에 코어 파일 생성에 영향을 미칠 수 있는 다른 요인이 있을 수 있습니다.

답변2

현재 POSIX 텍스트가 나열됩니다.

ulimit [-H|-S] -a

ulimit [-H|-S] [-c|-d|-f|-n|-s|-t|-v] [newlimit]

따라서 POSIX 표준에는 다음이 포함되어 있습니다 ulimit -c corelimit.

관련 제한은 호출에 의해 제어되며 setrlimit()호출은 setrlimit()호출 프로세스 또는 해당 프로세스의 하위 제한만 제어한다는 사실을 놓쳤을 수 있습니다.

서브셸을 호출하려고 하므로 ulimit ...이러한 설정은 해당 서브셸과 잠재적인 서브셸에만 적용됩니다.

즉, ulimit설정이 현재 작업 환경에 유효하려면 현재 셸을 호출해야 합니다. 단축키가 마음에 들면 해당 명령에 대한 단축키를 설정하거나 alias스크립트를 작성할 수 있지만 dot작업 쉘에 적용하려면 해당 스크립트를 명령(.)으로 호출해야 합니다.

관련 정보