7

WindowsマシンからリモートのLinux CentOSサーバーに新しいファイルをコピーするための小さなbashスクリプトを作成しています(git-shellを使用してこのスクリプトを実行します)。サーバーで実行されているPythonアプリケーションを再起動して、それらの新しいファイルを使用しますファイル。

問題は、このスクリプトを実行するたびに、実際に実行中のプロセスを終了してから再度開始する必要があるため、開始したプロセスの pid を取得し、それをリモート ホストのファイルに保存して読み取れるようにすることです。そこから次回プログラムを実行して強制終了します。

私のコードは今では次のようになります。

echo "Copying code files to server..."
# The destination folder has to exist in the server
scp -r ./python/ root@myserver:/root/

echo "Checking for running processes..."

if ssh root@myserver 'ls dmr.pid >/dev/null'; then
    echo "PID file exists, reading file..."
    PID=$(ssh root@myserver 'cat dmr.pid')

    # Terminate the actual process
    echo "Terminating the process with PID '$PID'..."
    ssh root@myserver 'kill $PID'
else
    echo "PID file doesn't exist, not known processes running"
fi

# Restart the server and get the PID
echo "Restarting the server..."
ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'

SERV_PID=$(ssh root@myserver 'echo $!')

echo "Saving PID to file dmr.pid"
ssh root@myserver "echo '$SERV_PID' > \"dmr.pid\""

echo "Sucesfully finished!"

重要な行は次のとおりです。

ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'
SERV_PID=$(ssh root@myserver 'echo $!')

これに関する問題は、スクリプトは終了しますが、ファイルと $SERV_PID 変数が空になることです。

そして、出力をリダイレクトせず、次のようなことをするだけの場合:

SERV_PID=$(ssh root@myserver 'python /root/python/run_dev_server.py & echo $!')

「サーバーの再起動」後に行き詰まり、PIDまたはそれを含むファイル、さらにはスクリプトの終わりさえも取得できません。

しかし、コンソールでこれを正しく実行すると:

ssh root@myserver 'python /root/python/run_dev_server.py & echo $!'

端末に出力された PID を取得します。

これに関するアドバイスをいただければ幸いです。

4

2 に答える 2

4
ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 &'
SERV_PID=$(ssh root@myserver 'echo $!')

上記のコードでは、2 つの ssh コマンドを実行しており、両方が 2 つの異なるシェルを作成しています。問題は、現在のシェルecho $!から最新のバックグラウンド プロセスの ID を取得することです。これはありません。

つまり、2 回目に ssh を実行すると、それは新しいシェルであり、バックグラウンド プロセスが実行されていないためecho $!、出力が得られません。これは、PID ファイルが空である理由を説明しています。

代わりにできることは、Python スクリプトのすべてのインスタンスを検索し、killallコマンドを使用してそれらを強制終了することです。psまたは、コマンドを使用した同様のアイデア。

于 2012-11-02T19:12:51.750 に答える
2

Kingslndian のおかげで、必要な 3 つのステップを実行する 1 つのコマンドを作成することで解決できたので、異なるシェルで実行する際の問題を回避できました。

 ssh root@myserver 'python /root/python/run_dev_server.py > /dev/null 2>&1 & echo $! > "dmr.pid"'
于 2012-11-02T20:05:25.277 に答える