Inicia a função em segundo plano e salva o PID

1

Eu tenho um script que contém duas funções. uma função inicia a outra como um processo em segundo plano e retorna o processamento do UID. Isso funciona bem, desde que eu não queira colocar o PID em uma variável dedicada. Uma vez que eu tento atribuir o PID a uma variável, o script trava até que a operação em segundo plano termine.

Esse comportamento pode ser demonstrado pelo seguinte script:

#!/bin/sh

foo () {
    bar &   # start bar in background
    echo $! # return bars' PID
}

bar () {
    sleep 5 # some background operation
}

FOO=$(foo) # remember the PID of bar
echo $FOO  # expectation: should echo immediately
           # reality: echo after five seconds

Então, minha pergunta é: Como posso fazer o script continuar executando depois de iniciar a função bar , sem esperar que bar retorne?

    
por Koltak 26.01.2018 / 16:11

1 resposta

1

O subshell iniciado por $(foo) tem que sair completamente (junto com qualquer processo em segundo plano), para que o shell principal saiba que não há mais entrada a ser capturada pela substituição do comando. Afinal, bar poderia produzir algo após o sono.

Mas você pode redirecionar a saída de bar para /dev/null :

foo () { 
    bar > /dev/null &
    echo "$!"
}

Ou (no Bash ou no ksh) nix a substituição do comando e execute bar no shell principal:

foo() {
    typeset -n _pid=$1
    bar &
    _pid=$!
}
foo FOO
echo "$FOO"

(Ou o equivalente com eval no padrão sh .)

    
por 26.01.2018 / 16:34