我有三个 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
Run Code Online (Sandbox Code Playgroud)
我将每个程序设置为在连续几天的同一时间运行,原因有两个:(1) 我知道前一个程序将在 24 小时内完成,以及 (2) 我假设服务器上的负载同时相似连续几天。理想情况下,我可以以某种方式获取第一个程序的进程 ID 并将其传递给第一个wait命令,第二个程序和wait命令也类似。有任何想法吗?
编辑
wait与这种特定情况相比,我对确定进程 ID 并将其传递给命令的通用解决方案更感兴趣。
问题是你用 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
Run Code Online (Sandbox Code Playgroud)
没有理由&的sas线; at总是在“后台”运行作业。
接下来,您必须弄清楚如何解决前面提到的冲突。特别是,如果 1 月 11 日的作业在 24 小时后(1 月 12 日下午 5 点)还没有完成。有几种方法可以解决这个问题:
rm.sleepenh,如果可用,以避免自己进行计算)。| 归档时间: |
|
| 查看次数: |
1662 次 |
| 最近记录: |