Autor Tópico: Multithreading em shell scripts  (Lida 2604 vezes)

Offline JarbasAugusto

  • Usuário Ubuntu
  • *
  • Mensagens: 50
    • Ver perfil
Multithreading em shell scripts
« Online: 13 de Outubro de 2007, 09:36 »
Olá,

Gostaria de executar 4 instâncias de um programa, com um script apenas em shell. É possível??
Pois, se coloco dessa forma:
Código: [Selecionar]
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.

Offline rui_acp

  • Usuário Ubuntu
  • *
  • Mensagens: 18
    • Ver perfil
    • Programador Anónimo
Re: Multithreading em shell scripts
« Resposta #1 Online: 13 de Outubro de 2007, 11:21 »
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:

Código: [Selecionar]
#!/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:

Código: [Selecionar]
  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:

Código: [Selecionar]
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).
« Última modificação: 13 de Outubro de 2007, 11:29 por rui_acp »

Offline JarbasAugusto

  • Usuário Ubuntu
  • *
  • Mensagens: 50
    • Ver perfil
Re: Multithreading em shell scripts
« Resposta #2 Online: 13 de Outubro de 2007, 11:41 »
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.
« Última modificação: 13 de Outubro de 2007, 16:23 por JarbasAugusto »

Darcamo

  • Visitante
Re: Multithreading em shell scripts
« Resposta #3 Online: 14 de Outubro de 2007, 12:59 »
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).