linux bash prevenção reunindo-se para o processo em segundo plano

0

Meu script faz o bando. Isso me impede de correr duas vezes. O script pode executar outro script e há um problema. Às vezes, outros scripts deixam os processos em segundo plano. Infelizmente eles herdam os rebanhos, eu não preciso disso. Qualquer wraper que fecha algumas alças de arquivo antes de executar o executável especificado?

Eu uso linux debian, mas não é uma distribuição ou versão linux impagável.

Cenário detalhado:

  1. Meu script A é executado
  2. Meu script A faz o rebanho
  3. Meu script A executa o executável externo B
  4. O External B executa o executável C como plano de fundo (herdar o lote)
  5. Externo B termina e deixa C em segundo plano (herdar o lote)
  6. Meu script A termina porque B termina
  7. Outro loop, Meu script A é executado (como o ponto 1)
  8. Meu script A cria um lote e falha, porque C ainda está em execução

Eu quero exatamente executar o executável externo B com o filehandle flocado. O bando deve ser mantido até que apenas o meu script A esteja em execução. Eu não quero um bando entre 2 e 3 pontos, porque haverá "buraco de bando". Existe algum invólucro com algo assim?

    
por Znik 04.08.2014 / 12:26

2 respostas

1

De acordo com a página man do flock , este é um uso da opção -u ou --unlock:

-u, --unlock

Drop a lock. This is usually not required, since a lock is automatically dropped when the file is closed. However, it may be required in special cases, for example if the enclosed command group may have forked a background process which should not be holding the lock.

A técnica prescrita é, portanto, algo assim:

(
    flock 200 | exit 99
    # some commands that should be guarded by the lock
    # some of them fork daemons that keep our lock file open
    flock --unlock 200 # we're done with the lock, we can release it
) 200>/path/to/lock-file
    
por 30.03.2016 / 10:31
0

Eu escrevi alguns wrappers ontem. Ele fecha todas as alças desnecessárias e, em seguida, chama o comando especificado. Infelizmente, ele não verifica o tipo de identificador, fecha todos, exceto alguns identificadores conhecidos.

<==== file: wrapper.sh ====>
#!/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

você chama isso:

wrapper.sh some_command command parameters

Eu posso usar este warapper no passo 3 no meu cenário de chamada. Então o bando existe dentro do script principal, e o wrapper quebra a herança no script chamado e nos filhos dele.

    
por 05.08.2014 / 09:03

Tags