순차적으로 하나씩 실행해야 하는 5개의 SAS 작업이 있습니다.
nohup sas filename1.sas &
나는 보통 명령줄에 이것을 입력하여 실행하고 몇 시간마다 수동으로 진행 상황을 확인합니다. 첫 번째 작업이 오류 없이 완료되면 두 번째 작업에 들어갑니다 nohup sas filename2.sas &
.
진행 상황을 수동으로 확인하는 대신 순차적으로 실행할 수 있는 sas 코드나 unix 명령이 있습니까?
기본 sas 파일에 %include 문을 사용하는 것을 고려했지만, 루핑 매크로가 많고 %include를 발생시키는 매크로를 수행한다고 생각합니다.
추신. 또한 일반적으로 위 명령을 사용하여 자동으로 로그와 lst 파일을 인쇄해야 합니다.
답변1
작업이 실행 중인지 확인하는 방법에는 여러 가지가 있습니다. 명령을 실행했다고 가정하면
nohup sas filename1.sas &
그 대가로 다음과 같은 내용이 표시됩니다.
[1] 7539
[mel@server] $ nohup: ignoring input and appending output to `nohup.out'
7539
무한 루프를 사용하여 다음과 같이 프로세스 번호가 존재하는지 확인할 수 있습니다.
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"
아니면 좀 더 조잡한 방법으로 뭔가를 할 수도 있습니다:
flag=1
while [ ${flag} -ne 0 ]
do
sleep 30
flag=$(jobs|wc -l)
done
echo "all background jobs have finished or died"
두 방법 모두 30초마다 백그라운드 작업이 있는지 확인하고 백그라운드에서 실행 중인 작업이 없으면 완료됩니다. 첫 번째 방법이 제가 선호하는 방법입니다.
편집하다(아래 댓글을 토대로):
filename1.sas
이전 작업의 성공 여부에 관계없이 5개 작업을 모두 순서대로 실행하려면 다음을 수행할 수 있습니다(아래 코드에서는 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