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
我將每個程序設置為連續幾天同時執行,原因有兩個:(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
沒有理由排隊
&
;始終“在後台”執行作業。sas``at
接下來,你必須弄清楚你想如何解決前面提到的衝突。特別是,如果 1 月 11 日的工作在 24 小時後(截至 1 月 12 日下午 5 點)還沒有完成。有幾種方法可以解決它:
- 這不是真正的 1 月 12 日的工作。它應該在 program1.sas 完成後立即執行。在這種情況下,只需將其作為上述第一項工作的一部分,就像
rm
.- 這永遠不會發生。如果是這樣,您將手動修復它。在這種情況下,只需像上面那樣安排它。
- 它需要等待。在這種情況下,您可以將其安排在第一個 at 作業結束時,或使用鎖定文件,或計算適當的睡眠時間(或使用
sleepenh
,如果可用,以避免自己進行計算)。