少し複雑なスクリプトの一部として、シミュレーションを実行するようサーバーに指示する必要があります。通常、私は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秒後」を実行するにはどうすればよいですか?
に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
プロセスを有効にできます。
EDIT
:ssh
コマンドを実行して接続を閉じる場合:
ssh user@server 'simulation/script &'
"at"には1分未満の解像度はありませんが、偽造することができます。
echo "sleep 5 ; COMMAND" | at now
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;
注意してください: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
を使用します。これは、端末の標準出力へのエコーがここから機能するようには見えないためです)
私はそれを行う方がはるかに簡単だと思います:
sleep n && command
ここで、n
は秒数です。
スクリプトのバックグラウンドに加えてstdin/stdout/stderrをリダイレクトすると、バックグラウンドコマンドを実行した直後にSSHセッションを閉じることができます。
ssh hostname "/path/to/script </dev/null >/dev/null 2>/dev/null &"
今日同じ問題に遭遇しましたが、Nohup
を使用して解決できました
Nohup bash -c 'sleep 5 && at now -f script-name.sh'
あなたはそのようなスリープコマンドを使用してそれを行うことができます:
bash -c 'sleep 5 ; echo "test"' &