Scripts de wrapper simples gerando 100s de processos bash

2

Eu tenho esse tipo de wrapper GCC multilib configurado:

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

que essencialmente apenas envolve um gcc multilib de 64 bits para atuar como um gcc não-multilib de 32 bits. Quando eu construo algo (como binutils, por exemplo), isso gera centenas de bash processos, até mesmo fork falhar. Como posso contornar isso?

    
por rubenvb 26.10.2011 / 17:18

2 respostas

8

Parece que você nomeou seu script gcc, colocou-o no caminho e o chamou recursivamente. Ou nomeie seu script como algo diferente ou use um caminho explícito para o executável do gcc que você realmente deseja usar.

    
por 26.10.2011 / 17:31
5

Kevin já encontrou a questão central, ou seja, você está chamando seu próprio script de forma recursiva.

Uma maneira simples de evitar isso é chamar o programa empacotado com um caminho absoluto. Uma maneira mais chique é examinar $PATH manualmente e pular seu próprio script (conforme identificado por $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 "$@"

Algumas dicas adicionais:

  • Use exec se você não precisar mais do shell depois de ativar o comando real. Algumas conchas sabem fazer isso como uma otimização, mas não todas.
  • Use #!/bin/sh em vez de #!/bin/bash , a menos que você esteja usando recursos bash. Em muitos sistemas, o sh é um shell mais enxuto e rápido que o bash , com menos recursos, mas os scripts do wrapper raramente precisam desses recursos avançados.
por 26.10.2011 / 22:34