Bash Script para gerar nome e passar isso como argumento da linha de comando para programm

0

Eu tenho um script python que recebe 1 argumento de linha de comando

python arg

Agora quero um bash -script que:

  • chama python arg & com o argumento arg = 000
  • torna este x -times

então, portanto:

python 000 &
python 001 &
...
python 00x &

e se um desses processos terminar, o script deve ter um novo processo

python 00x+1 &

até um número N .

Notas de rodapé:

  • Eu estou bem ciente de que isso soa como uma solução feia que estou tentando fazer - mas sou forçado a fazer isso dessa maneira por um número variado de reas, que estão fora do meu domínio
  • Eu sei que deixo tudo (!) do trabalho para a comunidade, mas todo o meu googling e binging foi para zero linhas de script e, portanto, eu tenho que deixar como está.

EDIT: Eu preciso de uma solução que não use parallel .

    
por user69453 12.06.2015 / 15:22

2 respostas

3

Parece que você deseja executar várias instâncias do script python em paralelo, mas só executa tantas de uma vez e quando uma termina, inicia outra. Existe um utilitário prático para o chamado "paralelo", que pode ser combinado com o comando "seq" para gerar a lista de números.

 seq -f '%03.0f' 0 N | parallel -j x "python {}"

Acima, substitua N pelo limite superior. Substitua x pelo número máximo de scripts a serem executados simultaneamente.

seq gera a lista de números.

$ seq 5
1
2
3
4
5

$ seq 0 5
0
1
2
3
4
5

$ seq -f '%03.0f' 0 5
000
001
002
003
004
005

A última parte se parece com a seqüência de números que você está querendo usar ... 5 sendo um ponto de extremidade arbitrário que você pode alterar.

O comando parallel -j x "{}" executa x cópias do comando simultaneamente cada vez que substitui o {} por um dos valores da lista gerados por seq. Então, se você tiver uma sequência de 000-100 e você fornecer -j 3, ela será executada:

 python 000
 python 001
 python 002

tudo ao mesmo tempo. Quando uma dessas saídas, digamos "python 001" for concluída primeiro, ela iniciará "python 003". Suponha que "python 000" termine em seguida, ele substituirá "python 004" e assim por diante até que conclua todos os 101 trabalhos.

Obviamente, você não quer deixar muito alto ou sobrecarregará seu sistema.

seq é um comando linux muito padrão. paralelo é oferecido como um pacote opcional instalável através do gerenciador de pacotes para o seu sistema. Estranhamente sistemas baseados em RedHat não incluem, mas você pode obter fontes e binários a partir do site oficial:

link

    
por 12.06.2015 / 22:04
1

Com base na resposta anterior, mas em vez de usar o GNU paralelo, usando o comando padrão "xargs" com opção -P opção:

seq -f '%03.0f' 0 999 | xargs -n 1 -P 4 python

Tente ver como os processos são executados em paralelo:

seq 0 10 | shuf | xargs -n 1 -P 3 -I % sh -c "echo start %; sleep %; echo done %"
    
por 26.01.2016 / 13:34