Multithreading em shell scripts

Iniciado por JarbasAugusto, 13 de Outubro de 2007, 09:36

tópico anterior - próximo tópico

JarbasAugusto

Olá,

Gostaria de executar 4 instâncias de um programa, com um script apenas em shell. É possível??
Pois, se coloco dessa forma:
mp4live --automatic --file-cam_cfg1
mp4live --automatic --file-cam_cfg2
mp4live --automatic --file-cam_cfg3


A shell espera terminar a execução do primeiro para então executar o próximo, daí por diante.

rui_acp

#1
Experimenta adicionar >> /dev/null & no final de cada comando.

O /dev/null apenas está lá pra não poluir o ecran com o output, mas se quiseres omite essa parte ou até redireccionar o output de cada processo para um ficheiro de texto com o >>nome_ficheiro e redireccionar o output de cada processo para o respectivo ficheiro.
O mais importante é mesmo o & no final que indica que o comando é para ser executado em background e assim a shell não espera pelo seu fim para poder iniciar outro processo.

Para testar criei um simples programa em C que apenas fazia um sleep(60)  ( a.out ) e o seguinte script:


#!/bin/bash
   
./a.out >> /dev/null&
./a.out >> /dev/null&
./a.out >> /dev/null&
./a.out >> /dev/null&


Ao executar o ps para ver se estavam todos a correr obtive:


  PID TTY          TIME CMD
13166 pts/0    00:00:00 bash
13316 pts/0    00:00:00 a.out
13317 pts/0    00:00:00 a.out
13318 pts/0    00:00:00 a.out
13319 pts/0    00:00:00 a.out
13320 pts/0    00:00:00 ps

O que indica que estão os 4 em execução, logo: funciona!  :)
No teu caso recomendo:


mp4live --automatic --file-cam_cfg1 >>fich1.txt &
mp4live --automatic --file-cam_cfg2 >>fich2.txt &
mp4live --automatic --file-cam_cfg3 >>fich3.txt &


E ficas com o output de cada processo num ficheiro diferente, isto se o comando tiver algum output (desconheço o funcionamento dele).

JarbasAugusto

#2
OBRIGADO
O Output naum se faz necessário no meu caso, pois o mp4live serve para capturar imagens de cameras e codificar em MPEG4 ou 3GPP. Como quero que grave e codifique 4 câmeras ao mesmo tempo, sua solução foi perfeita, mais uma vez obrigado.

Darcamo

Só para completar, isso não é exatamente Multithreading. Com Multithreading você pode ter várias partes do programa sendo executadas ao mesmo tempo, mas todas dentro do mesmo processo.

A sua solução consiste em utilizar múltiplos processos e não múltiplas threads dentro do mesmo processo. De qualquer forma, essa solução realmente é a melhor para esse caso pois com múltiplos processos cada um roda de forma independente dos demais (o que claramente é a melhor opção nesse seu caso) enquanto que com Multithreading as múltiplas threads compartilham os mesmos recursos (incluindo a memória - variáveis).