從現在開始的某個時間做某事(也許還會在控制台中顯示結果)
我使用 Ubuntu 伺服器 16.04,我希望
at
在目前會話中使用該實用程序在 1 分鐘後執行某項操作(例如 anecho
),但不提供特定日期和時間 - 僅比目前時間提前 1 分鐘。這失敗了:
echo 'hi' | at 1m
我選擇的原因
at
是sleep
因為 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 上,參數必須以秒為單位