如何在unix sas中运行批处理sas作业?

如何在unix sas中运行批处理sas作业?

我有 5 个 SAS 作业,需要一个接一个地按顺序运行。

nohup sas filename1.sas &我通常在命令行中输入来运行并每隔几个小时手动检查进度。如果第一个作业完成并且没有错误,我然后输入第二个作业nohup sas filename2.sas &

是否有 sas 代码或 unix 命令我可以按顺序运行它们而不是手动检查进度?

我考虑过在主 sas 文件中使用 %include 语句,但是我相信我有许多循环宏和 do if then 宏,这些宏会抛出 %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 秒检查一次后台作业是否存在,并在后台没有作业运行时完成。第一种方法是我的偏好。

编辑(根据下面的评论)

要依次运行所有 5 个作业,无论前一个作业成功还是失败,您都可以执行以下操作(请注意,下面的代码假定您的 sas 作业文件名的格式为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

相关内容