shell script para controlar o número de processos de um usuário

5

Eu tenho que lançar um número total, NUMTOT de um programa (pode ser qualquer um, C, Mathematica, ns-2 ... ambientes matemáticos). O problema é que o computador onde estes processos funcionam apenas admite um número máximo de execuções, e. MAX, (MAX < NUMTOT).

Eu corro estes programas com a seguinte linha em um terminal

./run.sh -d directory num

repetidamente, onde run.sh é um script do qual eu invoco o programa de matemática; directory é o diretório onde meu programa está, e num indica o número de novas execuções (integer * num = NUM). O script 'run.sh' torna os diretórios 'num' com uma cópia do 'diretório' (o programa) e ativa o número 'num' de instâncias do programa. No meu caso, são instâncias do Matlab.

Eu gostaria de um script que monitora automaticamente o número de processos em execução e quando o número máximo é reduzido para (MAX-num), porque 'num' já foi concluído e, em seguida, inicie as próximas simulações 'num' do Matlab até que o NUM total de simulações seja concluído.

Seria ainda melhor se o script pudesse manter os MAX possíveis processos apenas invocando o próximo programa quando apenas um acabasse de terminar.

Na verdade, para saber o número de processos em execução, executo o seguinte script

ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'

que dá o total de Matlabs em execução neste momento.

Como eu poderia fazer todo o conjunto de simulações apenas a partir de um único script?

    
por Pablo 18.09.2013 / 16:44

6 respostas

3

A maneira usual de impor um número máximo de processos pelo usuário é via pam_limits(8) . Verifique a% man_de% da página para os detalhes e exemplos para alterar seu limits.conf(5) de acordo.

Especificamente, você deseja configurar o parâmetro /etc/security/limits.conf :

 nproc
    maximum number of processes

Um exemplo da manpage com este parâmetro em uso:

       @faculty        soft    nproc           20
       @faculty        hard    nproc           50
    
por 18.09.2013 / 16:51
1

Em vez de verificar o número de instâncias em execução periodicamente, sugiro que você crie um script que execute o programa várias vezes até que NUM seja alcançado e inicie esse script MAX times em paralelo.

Você também pode interceptar o sinal SIGCHLD que é emitido quando um processo filho é encerrado. Isso precisa ser ativado primeiro com set -o monitor . Um exemplo mais detalhado e alternativas podem ser encontrados em um tópico no Stackoverflow .

    
por 18.09.2013 / 16:47
1

Se os seus trabalhos do MATLAB não são interativos (ou seja, executar um script em lote), então você pode querer olhar para o software de programação em lote como Torque ou Slurm - este tipo de gerenciamento de recursos é exatamente o que eles são projetados para fazer .

Eles são normalmente usados em clusters de HPC, mas no seu caso você teria um cluster com apenas um nó de computação.

Slurm tem a vantagem de ser um sistema moderno e bem projetado, aproveitando anos de experiência anterior com outros agendadores. Torque / PBS tem a vantagem da familiaridade - muitas pessoas já usaram em outros clusters. O Slurm tem um conjunto de wrappers de compatibilidade para que as pessoas acostumadas ao PBS ou ao Torque possam começar a usá-lo imediatamente com comandos familiares.

Você terá muitas opções para controlar o agendamento de tarefas - por núcleos de CPU, memória, licenças disponíveis e muito mais. eles também fornecem contabilidade se você precisa acompanhar ou limitar o uso cumulativo por usuário. O Slurm, por exemplo, tem uma opção de ponderação de uso justo que pode ser usada para priorizar trabalhos de pessoas que não executaram muitos trabalhos recentemente sobre pessoas que usaram muito o sistema - o que geralmente é melhor do que uma cota fixa cputime.

Outra opção para contornar licenças limitadas é escrever seus scripts do MATLAB para que eles sejam compatíveis com o GNU Octave . bem como MATLAB. Em seguida, você poderá executar quantas execuções de teste / desenvolvimento forem necessárias e executar a execução final no MATLAB, se isso for necessário para publicar seus resultados ou colaborar com outros pesquisadores. O Octave é compatível principalmente com o MATLAB, mas existem algumas diferenças - aqui está um resumo .

    
por 19.09.2013 / 04:10
0

Eu acredito que o comando ulimit (assumindo shell) ou o comando limit (assumindo csh varient) tem um limite para o número de processos.

    
por 18.09.2013 / 17:48
0

Uma resposta em outro tópico que lida com a limitação do número de subprocessos no bash mostra o seguinte snippet, que aguardará até um dos 4 trabalhos concluídos, verificando a cada dez segundos.

while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done

Tenha em mente que essa estratégia de sono ativa é bastante ineficiente, grosseira e imprecisa.

    
por 19.09.2013 / 01:21
0

O paralelo GNU faz o que você precisa (e muito mais). No seu caso, você apenas executaria

cd directory && parallel -j num Matlab 

por exemplo.

    
por 27.01.2016 / 22:56