sshpc_run.sh
por EDSON - LAMBDA
—
última modificação
13/06/2023 11h31
sshpc_run.sh
— 5 KB
Conteúdo do arquivo
#!/bin/bash
#########################################################################################
## SSHPC - Cluster de processamento distribuído baseado em SSH ##
## ##
## Local: Laboratório Multiusuário de Bioinformática e Análise de Dados (LAMBDA) ##
## Centro de Biotecnologia (CBiotec), Universidade Federal da Paraíba (UFPB) ##
## Data: 30/05/2023 ##
## Coordenador: Edson Luiz Folador ##
## IC: Arthur Araújo de Lacerda ##
#########################################################################################
readonly PROGNAME=$(basename "$0")
readonly PROGDIR=$(readlink -m $(dirname "$0"))
readonly SSHPC_DIRECTORY="/home/sshpc"
# debugging flag
debugging() { ${debug} && echo -e "$1"; }
check_running_dir() {
### Checks for instruction files already running or to run
local mac="$1"
if [[ -n $(find "${SSHPC_DIRECTORY}/running/" -name "${mac}*") ]]; then
local instruction_file=$(find "${SSHPC_DIRECTORY}/running/" -name "${mac}*" | sort | head -n 1)
elif [[ -n "$(ls ${SSHPC_DIRECTORY}/run/)" ]]; then
local instruction_file=$(find "${SSHPC_DIRECTORY}/run/" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d ' ' -f 2- )
mv "${instruction_file}" "${SSHPC_DIRECTORY}/running/${mac}_$(basename ${instruction_file})"
local instruction_file="${SSHPC_DIRECTORY}/running/${mac}_$(basename ${instruction_file})"
else
debugging "No files to be run"
exit 0
fi
echo "${instruction_file}"
}
send_files() {
### ENV
debugging "ENV"
debugging "Sending files: ${comm} to client ${mac} ip: ${ip}, port: ${port}"
if $debug
then local env_command="scp -P ${port} \"${comm}\" sshpc@${ip}:~"
else local env_command="scp -q -P ${port} \"${comm}\" sshpc@${ip}:~"; fi
eval "${env_command}" || exit 1
}
send_compacted_files() {
### BEN
debugging "BEN"
debugging "Sending compacted files"
local ben_command='tar cjf - \"${comm}\" | ssh -n -p ${port} bioinfo@150.165.131.12 "tar xjf -"'
eval "${ben_command}" || exit 1
debugging "Compacted files sent"
}
get_files() {
### REC
debugging "REC"
debugging "Gettings files from client"
if $debug
then local rec_command="scp -P ${port} sshpc@${ip}:~/${comm}"
else local rec_command="scp -q -P ${port} sshpc@${ip}:~/${comm}"; fi
eval "${rec_command}" || exit 1
debugging "Files loaded from client"
}
compact_client_files() {
### BRE
debugging "BRE"
debugging "Compacting files for client"
local bre_command='ssh -n -p ${port} bioinfo@150.165.131.12 "tar zcf - \"${comm}\"" | tar zxf -'
eval "${bre_command}" || exit 1
debugging "Files for client compacted"
}
execute_command() {
### EXE
debugging "EXE"
debugging "Executing files on Client"
debugging "${comm}"
local comm=$(echo "${comm}" | sed "s/cpu_from_client/${1}/")
local exe_command="ssh -n -p ${port} sshpc@${ip} ${comm}"
eval "${exe_command}" || exit 1
debugging "exe_commands on client executed"
}
execute_on_server() {
### SRV
debugging "SRV"
debugging "Executing files on Server"
debugging "${comm}"
local exe_command="${comm}"
eval "${exe_command}" || exit 1
debugging "exe_commands on client executed"
}
delete_files() {
### DEL
debugging "DEL"
debugging "Deleting client files"
debugging "${comm}"
local del_command="ssh -n -p ${port} sshpc@${ip} rm \"${comm}\""
eval "${del_command}"
debugging "Client files deleted"
}
append_to_sshpc_log() {
local file="$1"
local ip="$2"
local mac="$3"
local lab="$4"
rm "${file}"
echo "$(date +"%d/%m/%y%t%H:%M")"$'\t'"${lab}"$'\t'"${ip}"$'\t'"$(basename "${file}")" >> "/home/sshpc/runned/$(date +"%Y%m")_sshpclog.txt"
}
iterate_command_file() {
### Iterates through command file
local file="$1"
local ip="$2"
local mac="$3"
local lab="$4"
local free_cores="$5"
local port="9123"
debugging "\nlab: $lab\nmac: $mac\navailable cores: $free_cores\nip: $ip\nfile: $file\nport: $port\n"
if [ ! -f "${file}" ]; then debugging "${file} instruction file does not exist" && exit 1; else
while read -r seq ins comm; do
[[ "$seq" =~ ^# ]] && continue
case $ins in
ENV)
send_files;;
BEN)
send_compacted_files;;
REC)
get_files;;
BRE)
compact_client_files;;
EXE)
execute_command "${free_cores}";;
SRV)
execute_on_server;;
DEL)
delete_files;;
esac
sed -i "s/${seq}/#${seq}/" "${file}"
done<"$file"
append_to_sshpc_log "${file}" "${ip}" "${mac}" "${lab}"
fi
}
main () {
# Debug
local debug=true
while true; do
case "$1" in
-q | --quiet) debug=false; shift;;
--) break;;
*) break;;
esac
done
debugging "=============================\n||| Running ${PROGNAME} |||\n============================="
# Variables sent from verify.sh
local ip=$1
local mac=$2
local free_cores=$3
local lab=$4
local file=$(check_running_dir "${mac}")
debugging "file: ${file}\nset to: ${mac}"
iterate_command_file "${file}" "${ip}" "${mac}" "${lab}" "${free_cores}"
}
main "$@"