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 を取得します。
これに関するアドバイスをいただければ幸いです。