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


15

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

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

sleep 5 ; ls > a.txt

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


シェルなしでは機能しないのはなぜですか?どのエラーが発生しますか?完全なパスを渡していますか?どの部分を解析する;か知っていますか?
ヘネス

この方法では、シェルは5秒間ブロックしてからコマンドを実行します。停止するシェルは必要ありません。
マーティン

次に、バックグラウンドのスクリプトまたはサブシェルで起動する必要があります。
ヘネス

回答:


34

ヘネスが示唆したものを書くより簡潔な方法は

(sleep 5; echo foo) & 

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

  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. atSTDINからコマンドを渡すこともできます。

    $ 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秒で何かを実行するために使用できます。しかし、それはハエを叩くために戦車を使用するようなものであり、Hennesの提案の方が優れています。


私はいじりまま$(sleep 5; echo foo) &、私はそれの前に$を必要と思った理由は、私はわからないが、私の構文が間違って私は長い(とより理解しやすい)版を掲載します。(command_for_in_new_shell)は短いですが。
ヘネス

@Hennesと私はあなたの非常に良いアイデアを露骨に剥ぎ取った(私はそれを支持した)。私がしたことはそれをより短くするためにそれを再フォーマットすることでした、実際の思考ビットのすべてのクレジットはあなたのものです:)。
テルドン

at秒単位で遅延して使用する方法はありますか?
基金モニカの訴訟

@NicHartleyいいえ at 21:43希望する場合は特定の時間(例:)を使用するか、4秒後sleep 4 && commandに実行するような単純な操作を行いますcommand
テルドン

4

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

例:

/ bin / sh -c "sleep 5; echo foo"&
[1] 63791
>アクティブシェルプロンプトはこちら

foo 5秒後に出力が表示されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.