Existem algumas maneiras de verificar se você tem trabalhos em andamento. Vamos dizer que você executou o comando
nohup sas filename1.sas &
você deve ver algo assim em troca:
[1] 7539
[mel@server] $ nohup: ignoring input and appending output to 'nohup.out'
você pode verificar a existência do número do processo 7539
usando um loop infinito da seguinte forma:
PID=${!} # this must be run immediately after submitting your job
flag=0
while [ $flag -eq 0 ]
do
sleep 30
ps -ef | grep ${PID} | grep -v grep >/dev/null
flag=${?}
done
echo "process ${PID} completed or died"
ou você pode fazer algo de maneira mais bruta:
flag=1
while [ ${flag} -ne 0 ]
do
sleep 30
flag=$(jobs|wc -l)
done
echo "all background jobs have finished or died"
qualquer um desses métodos verificará a existência de seus trabalhos em segundo plano a cada 30 segundos e será concluído quando não houver trabalho em execução em segundo plano. O primeiro método é minha preferência.
EDITAR (por comentários abaixo) :
Para executar todos os 5 trabalhos em execução um após o outro, independentemente do sucesso ou da falha do trabalho anterior, você pode fazer isso (observe que o código abaixo pressupõe que os nomes de arquivo sas job estejam no formato filename1.sas
, filename2.sas
, ..., filename5.sas
):
>nohup.out
for i in 1 2 3 4 5
do
nohup sas filename${i}.sas &
PID=${!}
flag=0
while [ $flag -eq 0 ]
do
sleep 30
ps -ef | grep ${PID} | grep -v grep >/dev/null
flag=${?}
done # end of while loop
echo "process ${PID} completed or died"
mv nohup.out filename${i}.log # preserve a separate log file for each job
# if you know the successful and failed exit codes of sas process,
# you can compare the result to those values here. Since you did not
# provide any exit codes, this is left as is.
done # end of for loop