Remove o bloqueio de arquivo desnecessário no script

1

Eu tenho algum script usando o executável flock. Isso funciona bem. O problema é quando esse script chama outro script e cria um processo em segundo plano. Nessa situação, o processo em segundo plano herda o identificador de arquivo bloqueado, este é o comportamento do sistema. Estou procurando qualquer ferramenta que funcione como wrapper e feche todas as alças desnecessárias, especialmente para bloqueios de arquivos.

Na minha ideia, apenas o processo principal deve ser protegido contra a execução duas vezes. Eu sei que isso é uma forma atípica. Normalmente, todas as crianças devem terminar por deixar o bloqueio de arquivo, mas, nessa situação, isso não funciona.

No momento, eu uso alguma solução alternativa, usando algum wrapper com o código principal acima, mas prefiro usar algum wrapper binário.

código:

#!/bin/bash
for fd in $(ls /proc/$$/fd); do
case "$fd" in
0|1|2|255)
    ;;
*)
eval "exec $fd>&-"
    ;;
    esac
done
exec $1 $2 $3 $4 $5 $6 $7 $8 $9
    
por Znik 05.08.2014 / 12:54

2 respostas

2

Seu script parece bom o suficiente. Há apenas algumas melhorias necessárias:

#!/bin/bash
shopt -s nullglob
for fd in "/proc/$$/fd/"*; do
    fd=${fd##*/}
    case "$fd" in
    0|1|2|255)
        ;;
    *)
        eval "exec $fd>&-"
        ;;
    esac
done
exec "$@"
  • nullglob impede que o padrão seja apresentado se nenhum arquivo for encontrado.
  • Globbing ou expansão de nome de arquivo com a ajuda do método de substituição de parâmetro ${v##pat} é suficiente. Usar ls não é necessário.
  • Você pode usar apenas "$@" para representar todos os argumentos passados para o script.

O script é garantido para rodar sem qualquer dependência externa, então é tão bom quanto rodar um binário.

    
por 05.08.2014 / 13:02
2

Você deseja executar um trabalho em segundo plano isolado de seu chamador. Isso parece muito com um daemon .

Infelizmente, não há nenhum utilitário padrão para iniciar um programa como um dameon. Debian e derivados fornecem start-stop-daemon , mas infelizmente isso não é portável para outras distribuições. Você pode instalar o daemonize , que será executado na maioria das variantes unix.

    
por 06.08.2014 / 02:37