간단한 래퍼 스크립트는 100개의 bash 프로세스를 생성합니다.

간단한 래퍼 스크립트는 100개의 bash 프로세스를 생성합니다.

이 GCC multilib 래퍼를 설정했습니다.

#file: gcc
#!/usr/bin/env bash
gcc -m32 "$@"

이는 본질적으로 64비트 multilib gcc를 래핑하여 multilib가 아닌 32비트 gcc로 작동합니다. binutils와 같은 것을 빌드하면 수백 개의 bash프로세스가 생성되고 심지어 fork실패하기도 합니다. 이 문제를 어떻게 해결할 수 있나요?

답변1

스크립트 이름을 gcc로 지정하고 경로에 넣은 다음 재귀적으로 호출하는 것처럼 보입니다. 스크립트에 다른 이름을 지정하거나 실제로 사용하려는 gcc 실행 파일에 대한 명시적인 경로를 사용하십시오.

답변2

케빈이미 핵심 문제를 발견했습니다. 즉, 자신의 스크립트를 재귀적으로 호출한다는 것입니다.

이를 방지하는 간단한 방법은 절대 경로를 사용하여 래핑된 프로그램을 호출하는 것입니다. 더 멋진 접근 방식은 $PATH(그림 참조 $0) 자신의 스크립트를 수동으로 확인하고 건너뛰는 것입니다.

find_command () {
  script_dir={1%/*}; command_name=${1##*/}
  real_command=
  IFS=':'; set +f
  for d in $PATH; do
    if [ "$d" = "$script_dir" ]; then continue; fi
    if [ -x "$d/$command_name" ]; then real_command="$d/command_name" break; fi
  done
  set -f; unset IFS
  [ -n "$real_command" ]
}
find_command "$0" || {
  echo 1>&2 "$0: cannot find underlying command in \$PATH=$PATH"
  exit 2
}
exec "$0" -m32 "$@"

몇 가지 추가 팁:

  • exec실제 명령을 시작한 후 쉘이 더 이상 필요하지 않은 경우 이 명령을 사용하십시오. 일부 쉘은 최적화를 위해 이 작업을 수행하는 것을 알고 있지만 전부는 아닙니다.
  • bash 기능을 사용하지 않는 한 #!/bin/sh대신 사용하세요 . #!/bin/bash많은 시스템에서 sh이는 더 적은 기능을 갖춘 더 간결하고 빠른 셸이지만 bash래퍼 스크립트에는 이러한 고급 기능이 거의 필요하지 않습니다.

관련 정보