異なるサーバー上で同時に異なるスクリプトを実行したいと思います。 (+/- 2秒は問題ありません。)条件は、Cronスケジュールを介さずにマスターサーバーの呼び出しを介してスクリプトを起動することです。 SSHを試しましたが、そうした場合は、セッションを削除する前に、リモートサーバーでスクリプトの実行が完了するまで待つ必要があります。私は、スクリプトが終了するのを待たずにリモートサーバーでスクリプトを起動できる代替案を探しています。 PS - 私のユースケースでは、CLIを使用せずに外部スクリプトを使用してプライマリサーバーでスクリプトをトリガーするアプリケーションを呼び出しています。ありがとうございます。
答え1
GNUを使用すると、システムがログアウト時にすべてのプロセスを終了しないscreen
限り、サーバーへの接続を維持せずにリモート操作を実行できます。具体的には、以下を使用できます。systemd
#!/bin/sh
ssh server1 screen -d -m command1
ssh server2 screen -d -m command2
# ...
各ローカルssh
セッションはscreen
リモートプロセスを開始した直後に終了し、リモートプロセスは実行されたコマンドが完了した直後に終了します。ssh
各行の後にサフィックスを追加して並列接続を作成できます&
。
マニュアルからの抜粋screen(1)
:
-d -m
screen
「分離」モードで起動します。これにより、新しいセッションが作成されますが、接続されません。これはシステム起動スクリプトに役立ちます。
1システムがsystemd
を使用して設定されている場合は、それをkillUserProcesses=yes
交換する必要があります。screen
systemd-run --user --scope screen
答え2
後で拒否されるサブシェルにコマンドを送信するには、「&disown」を使用します。プロセス追跡が必要な場合はnohupを使用してください。私が以下で使用するのは眠るバイナリがラップされています。時間何が起こっているかをコンソールから迅速なフィードバックを提供するために呼び出されました。
time sleep 5
シェルがブロックされているため、セッションを正しく終了できません。
time sleep 5 &
皮が剥がれたので終了してくださいそれでも人を殺すでしょう。睡眠コマンド。
time nohup sleep 5 &
このサブシェルはnohupであるため、ロギングによってより良い操作を実行できますが、サブシェルはそれを作成したシェルに接続し続けるため、セッションが終了するとサブシェルとそのプロセスは削除されます。あなたは本当にそれを拒否する必要があります:
#!/bin/bash
nohup sleep 500 & disown
pid=$!
echo $pid > /tmp/time.pid
exit 0