Console

從現在開始的某個時間做某事(也許還會在控制台中顯示結果)

  • December 9, 2017

我使用 Ubuntu 伺服器 16.04,我希望at在目前會話中使用該實用程序在 1 分鐘後執行某項操作(例如 an echo),但不提供特定日期和時間 - 僅比目前時間提前 1 分鐘。

這失敗了:

echo 'hi' | at 1m

我選擇的原因atsleep因為 sleep 會妨礙目前會話,因此更適合在另一個會話中延遲命令,而不是我們大部分時間使用的命令。AFAIR,at不這樣做,不會妨礙我的會話。

更新_1

通過 Pied Piper 的回答,我嘗試過:

(sleep 1m; echo 'hi')  &

我對這種方法有疑問:“hi”流列印在我的主提示中,並且還在_包含它的主提示下方添加了一個空的輔助提示 ( ),請參閱:

USER@:~# (sleep 1m; echo 'hi')  &
[1] 22731
USER@:~# hi
^C
[1]+  Done

更新_2

根據彼得科德的回答,我試過:

(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)

這在 Bash 4.4 中可以正常工作,但在某些舊版本中似乎不行(請參閱答案中的評論)。我個人在自己的環境中使用 Bash 4.3。

正確的用法是,時間規範at <timespec>在哪裡。<timespec>您還可以使用該-f選項來指定包含要執行的命令的文件。如果-f不使用重定向,則 at 將讀取從標準輸入(標準輸入)執行的命令。

在您的範例中,在您按下輸入後一分鐘(現在)執行“some command”(我在下面的範例中選擇“some command”為“echo hi”),預期<timespec>使用的是now + 1 minute. 因此,為了通過單線解決方案獲得您想要的結果,請使用以下命令:

echo 'echo hi' | at now + 1 minute

這應該(並且會)echo hi在一分鐘後執行命令。這裡的問題是該echo hi命令將由 at 命令在虛擬 tty 中執行,並且輸出將被發送到使用者的郵箱(如果配置正確 - 這需要更廣泛地解釋如何在一台unix機器,不屬於這個問題的範圍)。最重要的是,您將無法echo hi在發出命令的同一終端中直接看到結果。最簡單的選擇是將其重定向到“某個文件”,例如:

echo 'echo hi > /tmp/at.out' | at now + 1 minute

在上面的例子中,“some file”是/tmp/at.out,預期的結果是at.out/tmp 下的文件在一分鐘後創建並包含文本“hi”。

除了上面的now + 1 minute範例之外,還可以使用許多其他時間規範,甚至是一些複雜的時間規範。at 命令足夠聰明,可以解釋非常易讀的命令,如下例所示:

now + 1 day, 13:25, mid‐night, noon, …

有關可能的時間規範的更多資訊,請參閱 at 的手冊頁,因為可能的變化非常廣泛,可能包括日期、相對或絕對時間等。

在子shell中執行sleep

(sleep 60; echo -e '\nhi')  &

注意:在 Linux 上,您可以以秒或後綴 s/m/h/d(表示秒、分鐘、小時、天)給出睡眠參數。在 BSD 上,參數必須以秒為單位

引用自:https://unix.stackexchange.com/questions/408804