134 lines
4.1 KiB
Bash
Executable File
134 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# to run : ./deploy_mk.sh
|
|
# This will backup the current contents of /opt/MarketData/MarketData to /opt/MarketData/MarketData/MarketData_Rollback
|
|
# and deploy the mk binary to /opt/MarketData/MarketData
|
|
# 1) Stop the cron service
|
|
# 2) Wait for any running mk to complete
|
|
# 3) Perform the backup
|
|
# 4) Perform the deployment
|
|
|
|
# set xtrace if you want to see trace level
|
|
#set -o xtrace
|
|
|
|
# use systemctl so we can bypass the pager
|
|
sudo systemctl --no-pager stop cron
|
|
sudo systemctl --no-pager status cron
|
|
|
|
|
|
# The name of the MK process that we will need to ensure is not running during the deployment
|
|
PROCESS_NAME="mk"
|
|
|
|
# Define source and destination directories
|
|
SOURCE_DIR="/home/pi/ARM64/MarketData/MarketData/bin/Debug/net8.0"
|
|
DEST_DIR="/opt/MarketData/MarketData"
|
|
ROLLBACK_DIR="/opt/MarketData/MarketData_Rollback"
|
|
|
|
# Find the PID of the process. We take into account that multiple mk could be running at any given time
|
|
# -e: Select all processes
|
|
# -o pid,comm: Output only PID and command name
|
|
# grep -w: Match whole words for the process name
|
|
# awk '{print $1}': Extract the PID
|
|
check_process()
|
|
{
|
|
PID=$(ps -e -o "pid,comm" | grep -w "$PROCESS_NAME" | grep -v grep | awk '{print $1}')
|
|
|
|
# Check if the process was found
|
|
echo "Check run status "
|
|
if ! [ -z "$PID" ]; then
|
|
|
|
# Split $PID on LineFeed and create PID_ARRAY
|
|
my_string="$PID"
|
|
delimiter="\n"
|
|
temp_string="${my_string//$delimiter/ }"
|
|
PID_ARRAY=($temp_string)
|
|
|
|
# Display what we found
|
|
for item in "${PID_ARRAY[@]}"; do
|
|
echo "Found (PID: $item)"
|
|
done
|
|
|
|
# Wait for each process to end
|
|
for item in "${PID_ARRAY[@]}"; do
|
|
echo "Waiting for process '$PROCESS_NAME' (PID: $item) to end..."
|
|
while ps -p "$item" > /dev/null; do
|
|
sleep 5 # Wait for 5 seconds before checking again
|
|
done
|
|
done
|
|
echo "Process '$PROCESS_NAME' has ended."
|
|
return 1
|
|
else
|
|
echo "Process '$PROCESS_NAME' (PID: $PID) is not running."
|
|
return 0
|
|
fi
|
|
}
|
|
|
|
# This will wait on all mk processes that are currently running.
|
|
# We keep executing the check_process command until we do not encounter
|
|
# any mk processes that may have started while we were waiting for others to complete.
|
|
until check_process; do
|
|
echo "Waiting for process to end..."
|
|
sleep 1
|
|
done
|
|
|
|
# Here begins the actual deployment process
|
|
|
|
# Check if source directory exists
|
|
if [ ! -d "$SOURCE_DIR" ]; then
|
|
echo "Error: Source directory '$SOURCE_DIR' not found."
|
|
# use systemctl so we can bypass the pager prompts
|
|
sudo systemctl --no-pager restart cron
|
|
exit 1
|
|
fi
|
|
|
|
# Check if destination directory exists, create if not
|
|
if [ ! -d "$DEST_DIR" ]; then
|
|
echo "Destination directory '$DEST_DIR' not found. Creating it..."
|
|
mkdir -p "$DEST_DIR"
|
|
fi
|
|
|
|
# Check if rollback directory exists, create if not
|
|
if [ ! -d "$ROLLBACK_DIR" ]; then
|
|
echo "Rollback directory '$ROLLBACK_DIR' not found. Creating it..."
|
|
mkdir -p "$ROLLBACK_DIR"
|
|
fi
|
|
|
|
# Clean the rollback folder
|
|
echo "Clean the rollback folder"
|
|
rm -rf $ROLLBACK_DIR/*
|
|
num_files=$(find "$ROLLBACK_DIR" -maxdepth 1 -type f | wc -l)
|
|
echo "Number of files after clean '$ROLLBACK_DIR': $num_files"
|
|
echo ""
|
|
|
|
# Backup current release
|
|
echo "Backup the current release"
|
|
cp -rv "$DEST_DIR"/* "$ROLLBACK_DIR"/
|
|
num_files=$(find "$ROLLBACK_DIR" -maxdepth 1 -type f | wc -l)
|
|
echo "Number of files after copy to backup '$ROLLBACK_DIR': $num_files"
|
|
echo ""
|
|
|
|
# Remove files
|
|
echo "Clean the deployment folder"
|
|
find "$DEST_DIR" -mindepth 1 -path "$DEST_DIR/logs" -prune -o -exec rm -rf {} +
|
|
num_files=$(find "$DEST_DIR" -maxdepth 1 -type f | wc -l)
|
|
echo "Number of files after clean '$DEST_DIR': $num_files"
|
|
echo ""
|
|
|
|
# Copy all files from source to destination
|
|
# The -v option provides verbose output (shows files being copied)
|
|
# The -r option is for recursive copy, useful if source_folder contains subdirectories
|
|
echo "Deploy the release candidate"
|
|
cp -rv "$SOURCE_DIR"/* "$DEST_DIR"/
|
|
num_files=$(find "$DEST_DIR" -maxdepth 1 -type f | wc -l)
|
|
echo "Number of files after deployment '$DEST_DIR': $num_files"
|
|
echo ""
|
|
|
|
echo "Files copied from '$SOURCE_DIR' to '$DEST_DIR'."
|
|
|
|
# use systemctl so we can bypass the pager prompts
|
|
sudo systemctl --no-pager restart cron
|
|
sudo systemctl --no-pager status cron
|
|
|
|
echo "Done."
|
|
|