我有三个SAS程序要在后台运行一个周末。这三个程序将信息输出到同名的文件中,所以我需要在第一个程序完成后、第二个程序开始之前、第二个程序完成之后和第三个程序开始之前删除这些输出文件。显然,解决这个问题的最简单的方法是修改每个程序,使输出文件名不同,但这无助于我学习如何使用Unix。这就是我到目前为止所得到的:
# Begin by running the first SAS program in the background.
sas program1.sas & | at 5:00 PM JAN 11
# I'd like to wait until the first program finishes to remove
# the output files and run the second program.
wait ???
rm file1.sas7bdat file2.sas7bdat file3.sas7bdat file4.sas7bdat file5.sas7bdat
sas program2.sas & | at 5:00 PM JAN 12
# And now I repeat.
wait ???
rm file1.sas7bdat file2.sas7bdat file3.sas7bdat file4.sas7bdat file5.sas7bdat
sas program3.sas & | at 5:00 PM JAN 13我将每个程序设置为连续几天在同一时间运行,原因有两个:(1)我知道以前的程序将在24小时内完成;(2)我假设服务器上的负载在连续的几天内是相同的。理想情况下,我可以以某种方式获取第一个程序的进程ID,并将其传递给第一个wait命令,类似于第二个程序和wait命令。有什么想法吗?
与这种特定情况相比,我更感兴趣的是确定进程ID并将其传递给wait命令的通用解决方案。
发布于 2013-01-10 21:08:12
问题是你用at来做一些不应该用来做的事情,真的。你也有两个相互冲突的目标:“在程序1之后运行程序2”和“在1月12日下午5点运行程序2”。
问题的一个部分很容易解决: at允许多个命令。因此,不只是使用at来调度sas脚本,您还可以将rm放在作业中。
at 5:00 PM JAN 11 <<EOJ
sas program1.sas
rm file1.sas7bdat file2.sas7bdat file3.sas7bdat file4.sas7bdat file5.sas7bdat
EOJ&没有理由出现在sas行中;at总是“在后台”运行作业。
接下来,您必须弄清楚如何解决前面提到的冲突。特别是,如果1月11日的工作在24小时后还没有完成(在1月12日下午5点之前)。要做到这一点,有几种方法:
rm一样。sleepenh来避免自己计算)。https://unix.stackexchange.com/questions/60929
复制相似问题