Como executar o batch sas job no unix sas?

1

Eu tenho 5 trabalhos do SAS que preciso executar sequencialmente, um após o outro.

Eu normalmente digito nohup sas filename1.sas & na linha de comando para executar e verificar manualmente o progresso a cada poucas horas. Se o primeiro trabalho estiver completo e não houver erro, eu digite o segundo trabalho nohup sas filename2.sas & .

Existe um comando sas code ou unix? Posso executá-los sequencialmente, em vez de verificar manualmente o progresso?

Eu pensei em usar a instrução% include em um arquivo master sas, no entanto, eu tenho muitas macros de loop e, se eu acredito, macros que jogam o% include off.

PS. Eu também preciso que o arquivo log e lst sejam impressos, normalmente ele é impresso automaticamente usando o comando acima.

    
por SuperKing 15.08.2016 / 23:14

1 resposta

0

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
    
por 15.08.2016 / 23:32