完了を待たずにリモートサーバーでbashを実行する

完了を待たずにリモートサーバーでbashを実行する

異なるサーバー上で同時に異なるスクリプトを実行したいと思います。 (+/- 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 -mscreen「分離」モードで起動します。これにより、新しいセッションが作成されますが、接続されません。これはシステム起動スクリプトに役立ちます。


1システムがsystemdを使用して設定されている場合は、それをkillUserProcesses=yes交換する必要があります。screensystemd-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

関連情報