順番に1つずつ実行する必要がある5つのSASジョブがあります。
nohup sas filename1.sas &
私は通常コマンドラインにこれを入力して実行し、数時間ごとに手動で進行状況を確認します。最初のジョブがエラーなしで完了すると、2番目のジョブに入りますnohup sas filename2.sas &
。
進行状況を手動で確認するのではなく、順番に実行できるsasコードまたはunixコマンドはありますか?
基本的な sas ファイルに %include 文を使用することを検討しましたが、ループマクロが多く、%include を生成するマクロを実行すると思います。
PS。また、通常、上記のコマンドを使用して自動的にログと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