Estou fazendo algo semelhante no meu servidor doméstico, onde quero um sistema de enfileiramento rápido e sujo para cálculos químicos quânticos. O seguinte é um pedaço do meio do meu script de enfileiramento:
# If second argument passed, treat as PID to check for
# completion before proceeding
if [ -n "$2" ]
then
while [ 'ps aux | grep orca | sed -r 's/[a-z0-9]+[ ]+([0-9]+).*//' | grep "^$2\$" | wc -l' -gt 0 ]
do
sleep 1m
done
fi
Os comandos dentro dos back-ticks executam o seguinte:
- Chame
ps aux
para obter a lista de processos -
grep
o nome do executável ("orca
" aqui) para proteger-se contra o caso raro em que o processo de interesse foi executado por tempo suficiente para que o uso do PID seja retrocedido e o PID de interesse tenha sido atribuído a um não relacionado processo -
sed
de cada lista de processos restante, usando Regex estendido, para deixar apenas o número PID em cada linha -
grep
para verificar se algum dos PIDs encontrados corresponde ao PID de destino -
wc -l
fornece uma maneira fácil de contar o número de PIDs correspondentes (a contagem deve ser sempre um ou zero, mas a implementação-gt 0
deve ser robusta em relação a circunstâncias incomuns)
O script então dorme por um minuto (facilmente customizável) e repete a verificação do PID. Em qualquer ponto, o PID de interesse não é mais encontrado, o script segue em frente. No meu caso, os comandos downstream executam a computação apropriada; você pode se adaptar para executar qualquer ação que desejar.