Execução paralela de funções

2

Eu tenho 3 funções, como

function WatchDog {
sleep 1

#something
}
function TempControl {
sleep 480

#somthing
}
function GPUcontrol {
sleep 480

#somethimg
}

E eu estou correndo como

WatchDog | TempControl | GPUcontrol

Este script está no arquivo rc.local . Então, logicamente, ele deve ser executado automaticamente. A coisa é que a primeira função está indo bem. Mas segundo e terceiro não está começando. Mas se eu estou começando como

sudo bash /etc/rc.local 

está funcionando bem. Qual é o problema? A mesma coisa, se eu estou adicionando-o ao diretório init.d.

    
por Zhyhalo Oleksandr 22.09.2017 / 15:38

2 respostas

2

Pipe envia a saída de um comando para o próximo. Você está procurando o & (E comercial). Isso bifurca os processos e os executa em segundo plano. Então, se você executou:

WatchDog & TempControl & GPUcontrol

Ele deve executar todos os três simultaneamente.

Além disso, quando você executa sudo bash /etc/rc.local , acredito que esteja executando-as em série, não em paralelo (espera que cada comando termine antes de iniciar o próximo). Isso seria mais ou menos assim:

WatchDog ; TempControl ; GPUcontrol

Separadores de comandos

; semi-colon - command1 ; command2

Isso executará command2 após o término do command1 , independentemente de ter sido bem sucedido ou não

& ampersand - command1 & command2

Isso executará command1 em uma subshell e executará command2 ao mesmo tempo.

|| OR logical operator - command1 || command2

Isso executará command1 e, em seguida, executará command2 SOMENTE se command1 falhar

&& AND logical operator - command1 && command2

Isso executará command1 e, em seguida, executará command2 SOMENTE se command1 for bem-sucedida.

    
por 22.09.2017 / 15:40
5

Simplesmente com o GNU paralelo :

export -f WatchDog && export -f TempControl && export -f GPUcontrol

parallel -j3 ::: WatchDog TempControl GPUcontrol
  • export -f <funcname> - exporte a função a ser referenciada por parallel

  • -j N - vá para trabalhos N em paralelo

Caso de teste para demonstração:

function a () { seq -s' ' 1 10; sleep 10; }
function b () { echo {a..z}; sleep 5; }
function c () { echo {-100..-80}; sleep 10; }
export -f a && export -f b && export -f c
parallel --no-notice  -j3 ::: c b a

a b c d e f g h i j k l m n o p q r s t u v w x y z
-100 -99 -98 -97 -96 -95 -94 -93 -92 -91 -90 -89 -88 -87 -86 -85 -84 -83 -82 -81 -80
1 2 3 4 5 6 7 8 9 10
    
por 22.09.2017 / 16:23