サーバーのリストと、サーバーで実行する必要があるBashスクリプトがあります。たとえば、カスタムコマンドを使用してサーバー上でcronjobをスケジュールするスクリプトがあります。これは単なる例であり、cronjobの削除、SSHキーの保存、デーモンの起動のためのスーパーバイザの設定などのスクリプトがあります。
私はSSHを介してプログラムでサーバーに接続しており、リモートサーバーでこのスクリプトを実行したいのですが、「バックグラウンドで」実行したいと思います。 「バックグラウンドで」と言うと、実際のスクリプトが実行された時点を心配せずにコードを完了する必要があることを意味します。これは、私のコードがブロック言語(PHP)で実行され、一部のスクリプトを実行するのに数分かかることがあるためです。 SSH経由でサーバーにスクリプトを送信して実行し、残りは心配しないでください。スクリプトの実行が完了したら、サーバーをカリングします(ある種のWebフックに似ています)。
ローカルファイルシステムリポジトリを保存するために、各スクリプトはローカルサーバー上のファイルに保存されず、ユーザーコンテンツ(cronjobの場合はコマンドとcron式である可能性があります)に変更され、文字列として表示されます。例:echo "{{name}}"
ユーザーがプログラムでスクリプトに挿入する「名前」変数を提供するスクリプトがあります。ユーザーが提供したすべてのスクリプト修正を私のファイルシステムに保存したくありません。
今私がする方法は、私のサーバーで次のコマンドを実行することです。
ssh -T user@host /bin/bash <<EOFX\n{{script}}EOFX
これはシェルコマンドを実行するためにPHPコマンドでラップされ、{{script}}
次に置き換えられます。
#!/bin/bash
cat << 'EOFY' > ./script.sh
{{executionScript}}
EOFY
. ./script.sh > ./script.out
curl --data "status=$(echo $?)" myserver.com
この場合、{{executionScript}}
サーバーで実行する必要がある最終スクリプトの変更されたバージョンに置き換えられます(例echo "John Doe"
:)。
これまではうまくいきましたが、SSHコマンドはスクリプトの実行が完了するのを待っています。sleep 4
beforeを追加すると、curl
私のコード(SSHコマンドの実行)はさらに4秒待ちます。
特定のスクリプトをバックグラウンドで実行する必要があるSSHコマンドを実行する方法はありますか?
私は達成しようとしている目標の高度な概要を提供し、誰かが私の問題(サーバーでユーザーが変更したスクリプトセットを実行する)のためのより良いソリューションを提供できることを願っています。私はこれがUnix / Linuxボードであることを知っており、私の主な問題はスクリプトが完了するのを待つSSHコマンドです。
答え1
コマンドシェルを使用するときにコマンドの前にnohupを追加すると、ログアウトまたはシェルを終了したときにコマンドが自動的に中断されるのを防ぎます。
nohup mycommand &
または
ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"
接続を切断しても引き続き実行する必要があります。