web-dev-qa-db-ja.com

秒後にコマンドを実行(スリープなし)

スリープなしでX秒後にコマンドを実行するにはどうすればよいですか。または、スリープなしでシェルなしでそのコマンドの応答を待つだけですか?

私はこれを使いましたが、うまくいきませんでした

sleep 5 ; ls > a.txt

バックグラウンドで実行する必要があります。私は5秒後にlsを実行しようとするスクリプトでそれを実行する必要がないようにし、シェルはスリープの終了を待つだけではありません

16
Martin

ヘネスが提案したことを書くより簡潔な方法は

(sleep 5; echo foo) & 

または、数秒以上必要な場合は at を使用できます。 atにコマンドを与える方法は3つあります。

  1. パイプする:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. 実行するコマンドをテキストファイルに保存し、そのファイルをatに渡します。

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. STDINからatコマンドを渡すこともできます。

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    次に、 CtrlDatシェルを終了します。 lsコマンドは1分で実行されます。

次のように、[[CC]YY]MMDDhhmm[.ss]の形式で非常に正確な時刻を指定できます

$ at -t 201412182134.12 < script.sh

これにより、スクリプトscript.shが2014年12月18日の21:34および12秒に実行されます。したがって、理論的には、atを使用して5秒後に何かを実行できます。しかし、それはタンクを使ってハエをたたくようなもので、ヘネスの提案はより優れています。

35
terdon

バックグラウンドでシェルまたはスクリプトを起動することで、この問題を回避できます。

例:

/bin/sh -c "sleep 5; echo foo"&
 [1] 63791 
> Active Shell Prompt here 
 
 foo 5 2番目に遅い出力が表示されます。
4
Hennes