我有 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