连续调度后台任务

ass*_*mal 2 scheduling

我有三个 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 并将其传递给命令的通用解决方案更感兴趣。

der*_*ert 5

问题是你用 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 点)还没有完成。有几种方法可以解决这个问题:

  • 这真的不是 1 月 12 日的工作。它应该在 program1.sas 完成后立即运行。在这种情况下,只需将其作为上述第一个工作的一部分,就像rm.
  • 这永远不会发生。如果是这样,您将手动修复它。在这种情况下,只需像上面一样安排它。
  • 它需要等待。在这种情况下,您可以在第一个 at 作业结束时安排它,或使用锁定文件,或计算适当的睡眠时间(或使用sleepenh,如果可用,以避免自己进行计算)。