私はUbuntu Server 16.04を使用しています。at
このユーティリティを使用して、echo
特定の日時を指定せずに現在のセッションで今から1分(現在の時刻より1分前)にいくつかのタスクを実行したいと思います。
失敗します。
echo 'hi' | at 1m
at
私がこれを選択した理由sleep
は、睡眠が現在のセッションを妨げるため、ほとんどの時間を使用するセッションよりも他のセッションでコマンドを遅延させるのに適しているためです。 AFAIRはat
そうしませんし、私の会議を妨げません。
アップデート_1
Pied Piperの答えに基づいて、以下を試しました。
(sleep 1m; echo 'hi') &
このアプローチには問題があります。 「hi」ストリームがプライマリプロンプト内に印刷され、_
それを含むプライマリプロンプトの下に空のセカンダリプロンプト()も追加されます。以下を参照してください。
USER@:~# (sleep 1m; echo 'hi') &
[1] 22731
USER@:~# hi
^C
[1]+ Done
更新_2
Peter Coddの答えに基づいて、以下を試しました。
(sleep 2 && echo -e '\nhi' && kill -WINCH $$ &)
これはBash 4.4ではうまく機能しますが、以前のバージョンではうまくいかないようです(答えのコメントを参照)。私は個人的に私の環境でBash 4.3を使用します。
ベストアンサー1
正しい使い方は時間仕様があるat <timespec>
ところです。<timespec>
この-f
オプションを使用して、実行するコマンドを含むファイルを指定することもできます。リダイレクトがない場合、-f
atはstdin(標準入力)から実行するコマンドを読み取ります。
あなたの例では、Enterキーを押してから1分後に「some command」を実行したい場合(以下の例では「echo hi」として「some command」を選択しました)、使用するターゲット<timespec>
はですnow + 1 minute
。したがって、目的の結果を得るには、1行の解決策として次を使用します。
echo 'echo hi' | at now + 1 minute
その後echo hi
、1分後にコマンドが実行されます。ここでの問題は、echo hi
コマンドが仮想ttyのatコマンドによって実行され、出力がユーザーのメールボックスに送信されることです(正しく設定されている場合 - UNIXシステムのより広範な説明が必要であり、この質問の範囲外です)。 )。最も重要なのは、echo hi
コマンドを実行したのと同じ端末で直接結果を表示できないことです。最も簡単な方法は、次のような「一部のファイル」にリダイレクトすることです。
echo 'echo hi > /tmp/at.out' | at now + 1 minute
上記の例では、「some file」があり、予想される結果は、/ tmpの下に1分後に「hi」というテキストを含む/tmp/at.out
ファイルが生成されることです。at.out
now + 1 minute
上記の例に加えて、他の多くの時間仕様、さらにはいくつかの複雑な仕様も使用できます。 atコマンドは、次の例のように、人間が読めるコマンドを解釈するのに十分スマートです。
now + 1 day
, 13:25
, mid‐night
, noon
, ...
可能なバリエーションは非常に広く、日付、相対時間、絶対時間などが含まれる可能性があるため、可能な時間指定の詳細については、atのマニュアルページを参照してください。