26

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

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

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

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

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

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

4

8 に答える 8

29

「at」には1分未満の解像度はありませんが、それを偽造することができます:

echo "sleep 5 ; COMMAND" | at now
于 2016-09-02T12:53:23.110 に答える
14

at に秒はありません:

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 &'
于 2012-12-16T22:05:12.913 に答える
12

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;
于 2012-12-16T22:09:51.860 に答える
7

注: では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

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

于 2015-02-05T13:51:37.893 に答える
1

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

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

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

于 2012-12-21T12:40:27.643 に答える
1

次のような sleep コマンドを使用して実行できます。

bash -c 'sleep 5 ; echo "test"' &
于 2018-07-05T09:29:55.990 に答える