web-dev-qa-db-ja.com

今から5秒後にコマンドを実行

少し複雑なスクリプトの一部として、シミュレーションを実行するようサーバーに指示する必要があります。通常、私はssh user@server 'simulation/script'を実行してこれを実現します。ただし、そうすることは、'simulation/script'が完了するまでsshセッションを存続させることになり、私には望ましくありません。

最近atコマンドについて学びましたが、それは私の問題にうまく適合しているようです。
次に、サーバーにsshで接続し、atシミュレーションスクリプトを5秒で実行します(ssh接続を閉じるのに十分な時間以上です)。したがって、ssh接続が5秒以内に閉じられると、サーバーは、ssh接続が存続する必要なくシミュレーションを開始します。

私が困っているのは、「今から5秒後」のジョブをスケジュールするためにatが必要とする時間表現です。

次の時間式を試してみましたが、すべてエラーになります。

now + 5 seconds
now + 5 sec
now + 5 s
now + 5seconds
now + 5sec
now + 5 s
now+5sec
now+5seconds
now+5s

atでコマンド「5秒後」を実行するにはどうすればよいですか?

23
inspectorG4dget

secondsはありません:

man atさんのコメント:

  • 日付の指定は、時刻の指定に従う必要があります。 now + count time-unitsのような時間を指定することもできます。時間単位は分、時間、日、週のいずれかであり、今日に時間のサフィックスを付けて今日のジョブを実行し、明日ジョブを実行するよう指示できます。明日の時間を添えることによって。

したがって、atの代わりに、sleepを使用できます。

man 1 sleepをご覧ください


ssh user@server 'simulation/script'を待たずに実行したい場合は、次のようにしてください:

ssh user@server 'simulation/script' &

コマンドはバックグラウンドで実行されます。

さらに、Rawkodeが言ったように、Nohupはそこで役立ちます。

最後に:

Nohup ssh user@server 'simulation/script' &

nohupを使用すると、ターミナルを終了してsshプロセスを有効にできます。


EDITsshコマンドを実行して接続を閉じる場合:

ssh user@server 'simulation/script &'
14
Gilles Quenot

"at"には1分未満の解像度はありませんが、偽造することができます。

echo "sleep 5 ; COMMAND" | at now
24
TomOnTime

atは秒を使用せず、分/時間/日のみを使用します

できることは、スクリプトの前にNohupを付けることです。これにより、SSHセッションを切断したときにスクリプトが強制終了されなくなります。

ssh server 'Nohup yourscript.sh &'

注:上記を試した後、SSH接続を手動で終了する必要があります。

別の代替案はscreenです

screen -d -m yourscript.sh

これにより、後でいつでも再接続できる分離されたscreenプロセスが起動します。

注:次のスクリプトとコマンドでこれをテストしましたが、完全に機能しました。

SSHコマンド

ssh server.com 'screen -d -m ~/myscript.sh'

myscript.sh

#!/bin/sh
sleep 10
echo "hello world" > /tmp/hello
exit;
11
Rawkode

注意してください:man at-tスイッチ。これは日付時刻を秒で受け入れますが、残念ながら秒は切り捨てられます。

$ date; date --date="now +10 seconds" +"%m%d%H%M.%S"; echo "logger AAAA" | at -t $(date --date="now +5 seconds" +"%Y%m%d%H%M.%S")
Thu Feb  5 14:45:57 CET 2015
02051446.07
warning: commands will be executed using /bin/sh
job 8 at Thu Feb  5 14:46:00 2015

...そして、ジョブが実際に過去にスケジュールされる可能性があります(また、syslogにloggerを使用します。これは、端末の標準出力へのエコーがここから機能するようには見えないためです)

6
sdaau

私はそれを行う方がはるかに簡単だと思います:

sleep n && command   

ここで、nは秒数です。

1
user6787662

スクリプトのバックグラウンドに加えてstdin/stdout/stderrをリダイレクトすると、バックグラウンドコマンドを実行した直後にSSHセッションを閉じることができます。

ssh hostname "/path/to/script </dev/null >/dev/null 2>/dev/null &"

ソース: https://serverfault.com/a/36436/138334

1
Preston

今日同じ問題に遭遇しましたが、Nohupを使用して解決できました

Nohup bash -c 'sleep 5 && at now -f script-name.sh'

0
Xaero Degreaz

あなたはそのようなスリープコマンドを使用してそれを行うことができます:

bash -c 'sleep 5 ; echo "test"' &
0
ijj